Bashスクリプトで `|| true`または`||どちらがより慣用的ですか?

Bashスクリプトで `|| true`または`||どちらがより慣用的ですか?

私はシェルスクリプトをあまりしないので読んで少し驚きました。出荷書類ビーチgit submoduleこの記事では、彼らが使用する構文を見ました。

サブモジュールのコマンドでゼロ以外の戻りが発生すると、処理は終了します。これは|| :コマンドの最後に追加することで上書きできます。

|| :コマンドを強制的に正常に終了するための略称でこれを見つける必要がありました。コマンドを正常に終了する必要があるたびにを使用します|| true|| :これはより慣用的なものと見なされますか?

ベストアンサー1

trueBourne シェルに組み込まれていません。いつもそうです(これは以前に紹介された:コメント入力方式でした)。#

そして、タイピング時間が短いので、人々が好む:ものかもしれませんtrue

POSIXシェルの別の違いに注意してください(その場合はbashPOSIXモードでのみ)。 whileは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 :after return に設定されます。varvalue:true

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

また、|| true一連のシェルで動作できますが、キャンセルすることはできません。rccsh|| :set -ecsh

|| :と等しくないことを:意味します。または:異なり(つまり、古いパイプラインが失敗した場合)

set -e
false

ゼロ以外の(失敗)終了状態set -e(オプションとも呼ばれる)が原因でシェルがerrexit終了するようにします。ゼロ以外の終了状態を返すコマンドが次のように使用されるfalse場合set -e状況図:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :キャンセルのみ可能ですset -e。キャンセルして終了ステータスを次に設定するfalse || :効果は、より慣用的に言うと、コマンドの失敗した終了コードを無視しようとします。ほとんどの人はこれがより明確であると思います(意図をより明確に伝えます)。set -e0|| true

おすすめ記事