それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashの何もしない特殊コマンド : コロン

: はコマンドです。

え?コマンド? と思うかもしれません。はい、コマンドです。記号一文字がコマンドです。

: がコマンド(関数)の証拠
takuya@~$ type :
: はシェル組み込み関数です
: コマンドを実行した結果
takuya@~$ : ; echo $?
0

: は何に使うの?

1文字コマンド : はtrue (終了ステータス0)を常に返します。 /bin/truetrue ( 関数 ) もコレと同じ仲間になります。

いつも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

記述を修正

参考資料

*1: 「 : 」 を強調するため doを改行から始めてますが、普通はdo の手前で改行はしません。