シーケンスでパイプを意味する場合、pipefail
をスクリプト内にset -o pipefail
のように設定する必要があります。 man bash
から:pipefailオプションが有効になって でない限り
パイプラインの戻りステータスは最後のコマンド、 の終了ステータスです。 pipefailが有効になっている場合、パイプラインの戻りステータスは最後の(最も右の) コマンドの値がゼロ以外のステータスで終了するか、またはすべてのコマンドが正常に終了すると0になります。予約されている場合 言葉!パイプラインに先行する場合、そのパイプラインの終了ステータスは、前述の出口 ステータスの論理否定です。シェルは、 が値を返す前に、パイプライン内のすべてのコマンドが終了するのを待ちます。
単にコマンドを意味する場合は、各コマンドの終了ステータスを確認し、終了ステータスがゼロ以外の場合はフラグを設定してください。これは、コマンドが失敗した場合にのみEXIT
を設定するには、論理演算子OR ||
を使用しています
#!/bin/bash
EXIT=0
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0
grep -q a <<< 'ABC' || EXIT=$? # Will exit with 1
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0
echo $EXIT # Will print 1
exit $EXIT # Exit status of script will be 1
:あなたのスクリプトは次のようにフラグの値を返しています。複数のコマンドが失敗した場合、最後に失敗したコマンドの終了ステータスはスクリプトによって返されます。
これらのコマンドがバックグラウンドで実行されていない場合は、wait
はここでは関係ありません。
おそらくこれはhttp://stackoverflow.com/questions/3474526/stop-on-first-errorがあなたが望むものですか? –
@Marian Theisenいいえ、スクリプトは最初のエラーで停止してはなりません。前のコマンドが返すステータスに関係なく、スクリプト内のすべてのコマンドを実行する必要があります。 –