これはbashスクリプトではより慣用的です: `|| true`または `|| : `?

シェルスクリプトはそれほど多くないので、を読んでいると少し驚きました。 git submodule のドキュメントと、このドキュメントで使用されている構文を確認しました:

Aサブモジュールのコマンドからゼロ以外の値が返されると、処理が終了します。これは、コマンドの最後に|| :を追加することでオーバーライドできます。

|| :がコマンドを正常に終了させるための省略形であることを確認する必要がありました。コマンドを正常に終了する必要があるときはいつでも、|| trueを使用しました。 || :はより慣用的であると見なされますか?

コメント

  • それ' ||:(スペースなし)はbashでも有効であることに注意してください。 || :または|| 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 :では、varvalueに設定されたままです。 “2e9c356ccf”>

が返されますが、trueの場合は返されません:

$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1 

|| truercおよびcshのシェルで機能することにも注意してくださいファミリは|| :ではありません(ただし、cshset -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 

または

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です