6

-e複数のコマンドが s でつながれたオプションを使用して bash スクリプトを実行すると、意味をなさない動作が見られ、&&そのうちの 1 つが失敗します。失敗したコマンドでスクリプトが停止し、終了ステータスを返すことを期待しますが、代わりに残りのスクリプトを問題なく実行します。

ここに私にとって意味のある例があります:

$ false && true; echo $?
1

$ bash -xe -c "false && true"; echo $?
+ false
1

$ bash -xe -c "false; true"; echo $?
+ false
1

そして、これが私には意味をなさないものです:

$ bash -xe -c "false && true; true"; echo $?
+ false
+ true
0

これは、何が起こっているのか理解できないところです。false && trueステータス 1 を返すので、スクリプトが実行を停止してステータス 1 を返すべきではありませんfalse; true

実験中に、一連のコマンドを括弧で囲むと、期待どおりに機能することがわかりました。

$ bash -xe -c "(false && true); true"; echo $?
+ false
1

誰でもこれについて説明できますか?

4

3 に答える 3

8

ここでのロジックは、&&既にの使用エラー チェックであるということです。同じように、bash はif条件内の失敗を中止する価値があるとは見なしませんset -e

コマンドを括弧で囲むと、実際にはサブシェル内でこれらのコマンドを実行しているため、スクリプト自体はそのサブシェルの戻りのみを認識し&&ます。 .

于 2013-02-12T17:12:40.047 に答える
6

リファレンスマニュアルを引用します。

失敗したコマンドが、whileまたはuntilキーワードの直後のコマンドリストの一部、ifステートメントのテストの一部、&&または||で実行されたコマンドの一部である場合、シェルは終了しません。最後の&&または||に続くコマンド、パイプライン内の最後以外のコマンド、またはコマンドの戻りステータスが!で反転されている場合を除くリスト。

于 2013-02-12T17:39:56.380 に答える