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

答え2

これらの応答のほとんどは解決に失敗します:

まず、この議論はシェル以外のものとは関係ありません。ボンシェル( sh) 派生商品。つまり、すべての Bourne 派生シェルはtrue:を同じものとして扱います。プログラマは常に組み込まれているため、:代わりに使用することをお勧めしますが、過去には場合によっては常に組み込まれていませんでした。true:true

:2つの用途があります。と同義ではありませんが、#他の機能を持っています。でスクリプトをデバッグするときにset -x使用された行は#パーサーによって削除され、完全に無視されますが、使用された行は解析され:評価されます。これは-x行の下に表示され評価された値を表示するため、デバッグに非常に役立ちます。これは、モードでのみ表示されるprintステートメントをコードに入れるのと同じです-x。以下の値:は実際のコードなので、副作用がプログラムに影響を与える可能性がありますのでご注意ください。

答え3

通常、bashではコロン:true同じです。

|| :もっと慣用的だと思いますか?

私はこれがベースだと思います。コンテキスト

return valueaまたはaが常に真になるようにするには、キーワードをcondition使用する必要があります。trueこれにより、コードがより明確になり、視聴者に強調したい価値を伝えることができます。本物、つまり:

while true; do something

または

<commnad>
RETURN_VALUE= $? || true

欲しいなら何もしなかったまたは、NOPシェルではコロンを使用する必要があります。:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

または

while conditon
do
    : # DO NOTHING HERE
done

関連情報