|| と一緒に使用すると、この複合コマンド {...} がエラーで終了しないのはなぜですか。

|| と一緒に使用すると、この複合コマンド {...} がエラーで終了しないのはなぜですか。

このスクリプトを実行しようとしています。

#!/bin/bash -e

{ 
    echo "Doing something"; 
    will_fail                 # like `false` 

    echo "Worked"; 
} || echo "Failed"

驚いたことにwill_fail失敗しましたが、コマンドラインに「失敗」が表示されずに「動作」しました。

失敗後に複合コマンドがエラーなしで終了するのはなぜですかwill_fail

ベストアンサー1

Failed複合コマンドの終了ステータスは、で実行された最後のコマンドの終了ステータスであるため、印刷されません{ ...; }echoSuccessechoなので、複合コマンドは終了状態 0 で終了します。

次は3つの文字列を出力します。

{ echo "Do something"; echo "Worked"; false; } || echo "Failed"

~からPOSIX規格:

特に明記しない限り、コマンドの終了ステータスは、そのコマンドによって実行された最後の単純コマンドの終了ステータスです。


ここではさまざまなことが起こっています(要約)。

  • あなたはset -e積極的に走っています。コマンドがゼロ以外の終了状態を返す場合(代替として)、シェルは終了します。ただし、コマンドは(リストの一部であるwill_fail複合コマンド)の一部であるため(そしてリストの最後のコマンドではないため)、これには適用されません。||

    また、POSIX規格(私のハイライト):

    予約語の後に、、、、または複合リストを実行するとき-e、予約語で始まるパイプ、またはwhileuntilifelif!どんな命令でも最後の項目を除くAND-ORのリスト。

  • リストの最後の簡単なコマンド||はですecho "Failed"。これは、複合コマンドの完全終了状態を決定します。正常に実行されたため(そしてwill_failシェルが終了していないため)、状態はゼロになり、これは反対側の端が||実行されないことを意味します。

おすすめ記事