シェルスクリプトはそれほど多くないので、を読んでいると少し驚きました。 git submodule
のドキュメントと、このドキュメントで使用されている構文を確認しました:
Aサブモジュールのコマンドからゼロ以外の値が返されると、処理が終了します。これは、コマンドの最後に
|| :
を追加することでオーバーライドできます。
|| :
がコマンドを正常に終了させるための省略形であることを確認する必要がありました。コマンドを正常に終了する必要があるときはいつでも、|| true
を使用しました。 || :
はより慣用的であると見なされますか?
コメント
回答
true
はBourneシェルに組み込まれていません。 :
は常にそうでした(#
が導入される前にコメントを入力する方法でした)。
それは、入力するのが短いことが、おそらく人々がtrue
よりも:
を好む主な理由です。
の別の違いに注意してください。 POSIXシェル(bash
の場合、POSIXモードのみ):true
は通常の組み込みです(組み込みである必要はありません) 、:
は特別な組み込みです。これにはいくつかの影響がありますが、そのほとんどがこの特定のケースに影響を与える可能性は低いです。
-
:
コマンドが失敗した場合、リダイレクトが失敗したためを含め、シェルが終了します。実際には、リダイレクトを:
$ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE
-
var=value :
では、var
はvalue
に設定されたままです。 “2e9c356ccf”>
が返されますが、true
の場合は返されません:
$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
|| true
はrc
およびcsh
のシェルで機能することにも注意してくださいファミリは|| :
ではありません(ただし、csh
のset -e
をキャンセルしないでください)。
|| :
は:
と同じではありません。または:
それ以外の場合(つまり、前のパイプラインが失敗した場合)。
set -e false
set -e
(別名errexit
オプション)およびの終了ステータスがゼロ以外(失敗)です。 set -e
効果は、ゼロ以外の終了ステータスを返すコマンドが次のように条件として使用された場合にキャンセルされます。
if false; then ... while false; do ... false && : ... false || : ...
false && :
はset -e
のみをキャンセルします。 false || :
はset -e
の効果をキャンセルし、終了ステータスを0
に設定するため、より慣用的ですコマンドの失敗終了コードを無視したいということです。ほとんどの人は、|| true
の方が読みやすい(意図をより明確に伝える)と主張します。
コメント
-
&& :
は素晴らしいですが、これに関するドキュメントや詳細情報はありますか? Googleは、この種のキーワードを見つけようとして私に足りません…
回答
これらの回答のほとんどは:
の最も一般的な使用法に対処します。
まず、この説明は、 Bourne shell (sh
)派生。とはいえ、すべてのBourne派生シェルはtrue
と:
を同じものと見なします。プログラマーは、:
が常にtrue
が必ずしも組み込みではない場合がありましたが組み込みです。
:
には2つの用途。 #
の同義語ではありませんが、機能が異なります。 set -x
でスクリプトをデバッグする場合、#
が使用されている行はパーサーによって削除され、完全に無視されますが、:
が解析および評価されます。 -x
の下にこれらの行が表示され、評価後の値が表示されるため、これはデバッグに非常に役立ちます。これは、-x
モードでのみ表示されるprint
ステートメントをコードに配置するようなものです。 :
の後の値は実際のコードであり、副作用がプログラムに影響を与える可能性があるため、注意してください。
コメント
- 2番目の用途は何ですか?
回答
一般的に、bashではコロン:
とtrue
は同等です。
は| | :より慣用的だと思われますか?
コンテキスト。
return value
が必要な場合、またはcondition
が常にtrueの場合、true
キーワードを使用する必要があります。これにより、コードがより明確になり、値を強調する必要があることが視聴者に通知されます。 true 、つまり:
while true; do something
または
<commnad> RETURN_VALUE= $? || true
そして何もしない場合、またはNOP
シェルでは、コロン:
if condition then : # DO NOTHING HERE else do something fi
または
||:
(スペースなし)はbashでも有効であることに注意してください。|| :
または|| true
と同じことを行います。