: はコマンドです。
え?コマンド? と思うかもしれません。はい、コマンドです。記号一文字がコマンドです。
:
がコマンド(関数)の証拠
takuya@~$ type : : はシェル組み込み関数です
:
コマンドを実行した結果
takuya@~$ : ; echo $? 0
:
は何に使うの?
1文字コマンド :
はtrue (終了ステータス0)を常に返します。 /bin/true
や true ( 関数 )
もコレと同じ仲間になります。
いつもtrueになります。こんなのなんの役に立つの?いえいえ、いつもtrueで文字数が少ない。これが重要なのです。
たとえば無限ループに使います。
無限ループの例*1
while : ; do echo 1 ; sleep 1 ; done
その他の活用
次のように、if でシンタックスエラーの防止の為に使われます。
シンタックスエラーになる例
if command ; then else do some thing fi
if の then の中身が空だと?シンタックス・エラーになります。コレを防げます。
:
を使ってシンタックスエラー防止
if command ; then : # なにもしない : を使う else do some thing fi
なぜこんなのが出来たの?
だって、シェルスクリプトは、「終了ステータス」で判断するから。 関数が戻り値を 0 か0以外しか返せません。
だから プログラミング言語でいう 1 / true のかわりに :
も使えるようになっています。
他にもこんなことが出来ます。
次の例はtouch と同じです。これは、:
が必ず成功し0バイトを出力するので、空ファイルが作成されます。
: > output.txt
コメント代わりに 使うことも!
ヒアドキュメントと組み合わせると、ブロックコメント代わりに使うことも!!
bash のブロック・コメントを擬似的に実現する。
: << 'SKIP' コメント コメント SKIP
なんと : は引数とります。
不思議なことですが、 :
に引数を与えることが出来ます。
でも引数を渡しても何も起きません。だから、引数を無視する役目を見出すことが出来ます。 なのでコメント代わりに使えます。
例:引数をコメントとして使う。
$ : ここは引数
コメント代わりに使われることが多い
stack over flow では cronjob のコメントに使ってますね。 コメントアウト代わりに使う人が多いようです。
for command ; : ここの実行を待つ ; do : ここは何もしない done
この例みたいにif 文の中に埋め込みコメントに使えますよーって。めっちゃかっこいいwww
変数の初期化とかにも使えますね。そうだね
同じようなものに true (関数)があります。
takuya@~$ help true true: true 結果として成功を返します。 終了ステータス: 常に成功です。
同じです。しかし :
のようにコメントなどに使うと意味が変わってしまいますよね?
# コメントの例 : ここは何もしない true ここは何もしない
true は流石に使いづらいよ
なんの役にも立たない?
何の役にも立たないことが役に立つときもあるのです。
2019-08-23
記述を修正
参考資料
- http://stackoverflow.com/questions/3224878/what-is-the-purpose-of-the-colon-gnu-bash-builtin
- http://qiita.com/xtetsuji/items/381dc17241bda548045d]
*1: 「 : 」 を強調するため doを改行から始めてますが、普通はdo の手前で改行はしません。