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


36

私はあまりシェルスクリプトを実行しないので、ドキュメントをgit submodule読んでい、このドキュメントで使用されている構文を見たときは少し驚いていました。

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

|| :コマンドを強制的に正常に終了させるための略記である、検索する必要がありました。コマンドを正常に終了する必要があるときはいつでも、を使用しました|| true。され|| :、より慣用的であると考えられて?


||:(スペースなしで)bashでも有効であることに注意してください。|| :またはと同じことを行い|| trueます。
ブルーノブロノスキー

回答:


38

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

それは型に短いですので、それは、おそらく人々が好む主な理由である:以上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の後に:戻り、ない場合にはtrue

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

また、ノート|| trueのシェルで動作rcし、csh家族ではなく|| :(ただし、キャンセルしないset -ecsh)。

|| :はと同じではありません:別の方法(つまり、前のパイプラインが失敗した場合)を意味または実行し:ます

set -e
false

理由の終了にシェルを引き起こすset -efalse非ゼロ(失敗)終了ステータスを持っています。set -e効果がキャンセルされる場合はリターンゼロ以外の終了ステータスとして使用されていることコマンド状態のように:

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

false && :キャンセルのみset -e。終了ステータスをfalse || :キャンセルset -eして設定する0ので、コマンドの失敗終了コードを無視したいというのが、より慣用的です。ほとんどの人はそれ|| trueがより読みやすいと主張するだろう(意図をより明確に伝える)。


5
&& :素晴らしいですが、これに関するドキュメントや参考資料はありますか?Googleはこの種のキーワードを見つけようとして私に足りません…
イアンBytchek

5

一般的に、bashではコロン:true同等です。

|| :より慣用的であると考えられていますか?

文脈に基づいていると思います

aが必要な場合return value、またはa conditionが常にtrueの場合、trueキーワードを使用する必要があります。コードをより明確にし、値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

5

これらの応答のほとんどはの最も一般的な使用に対処するのに失敗します:

まず、この説明は、Bourneシェルsh)派生物ではないシェルとは関係ありません。それは、すべてのBourneシェル派生を見、言ったtrue:同じものとして。プログラマは常にの:代わりにを使用することをお勧めしますtrue。これ:は、常にビルトインである場合もあるtrueが、常にビルトインであるためです。

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


1
2番目の用途は何ですか?
ピーターモーテンセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.