私は多くのシェルスクリプトを解読しましたが、時には最も単純なものが私を混乱させます。今日私は:
(コロン)bashの組み込み機能を広く使用するスクリプトを見つけました。
これ文書それは簡単に見える:
: (a colon) : [arguments]
パラメータの拡張とリダイレクトの実行以外は何もしません。戻り状態は 0 です。
しかし、私は以前にシェル拡張のデモンストレーションで使用されたことを見たことがあります。私が見たスクリプトのユースケースでは、この構造を広く使用しています。
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
文字通り何百ものgrepがありますが、それ以上は同じです。上記の単純な構造に加えて、入出力方向の再指定はありません。戻り値は後でスクリプトでチェックされません。
私はそれを役に立たない構造、つまり「何もしないもの」と見ています。 「または何もしない」でこれらのgrepを終了すると、何が得られますか?どのような状況で、この設定は|| :
単にすべてのインスタンスから削除するのとは異なる結果になりますか?
答え1
組み込みコマンドは、:
Bash「デフォルトの割り当て」シェル拡張にも役立ちます。ここで、拡張は通常副作用としてのみ使用され、拡張値は削除されます。
# assign FOO=bar iff FOO is unset or empty
: "${FOO:=bar}"
答え2
:
スクリプトのsが代わりに使用されているようですtrue
。grep
ファイルに一致するものがない場合は、コメントに記載されているjw013のように、ゼロ以外の終了コードが返されますerrexit
(おそらくshebang行にあります)。 、s のいずれにも一致する項目がない場合、-e
スクリプトは終了します。grep
明らかに、これは著者が望んでいないので、彼は|| :
この特定の複合コマンドの終了状態を常にゼロにすることを追加しました。たとえば、より一般的なものです(私の経験上)|| true
/ || /bin/true
。
答え3
答え4
私はKernighanとPikeによって書かれた「The UNIXプログラミング環境」(c)1984という古い参考資料を見つけました。
147ページ(シェルプログラミング)では、次のように説明します。
「:」は、引数を評価して「true」を返す以外に何もしないシェル組み込みコマンドです。代わりに、[スクリプトの例を参照]を使用できます。本物、これは実際の終了状態のみを返します。 (まだ残っています。間違った注文する。 )しかし、':'はtrueよりも効果的です。ファイルシステムでコマンドを実行しないため。 [イタリック体/強調は私のものです。 ]