help set
から :
-e Exit immediately if a command exits with a non-zero status.
しかし、一部の人 (bash FAQ および irc freenode #bash FAQ の作成者) は、これを悪い習慣と見なしています。以下を使用することをお勧めします:
trap 'do_something' ERR
do_something
を実行する エラーが発生したときに機能します。
http://mywiki.wooledge.org/BashFAQ/105 を参照
set -e
コマンドまたはパイプラインにエラーがある場合、スクリプトの実行を停止します。これは、スクリプトのエラーを無視するデフォルトのシェル動作とは逆です。 help set
と入力します ターミナルで、この組み込みコマンドのドキュメントを参照してください。
bash による - Set Builtin マニュアル (-e
の場合) /errexit
が設定されている場合、単一の単純なコマンド、リスト、または複合コマンドで構成されるパイプラインがゼロ以外のステータスを返すと、シェルはすぐに終了します。
デフォルトでは、パイプラインの終了ステータスは、pipefail
でない限り、パイプラインの最後のコマンドの終了ステータスです。 オプションが有効になっています (デフォルトでは無効になっています)。
その場合、最後の (右端の) コマンドのパイプラインの戻りステータスは、ゼロ以外のステータスで終了します。すべてのコマンドが正常に終了した場合はゼロになります。
終了時に何かを実行したい場合は、 trap
を定義してみてください 、例:
trap onexit EXIT
どこで onexit
単純なスタック トレースを出力している以下のように、終了時に何かを行う関数です:
onexit(){ while caller $((n++)); do :; done; }
同様のオプション -E
があります /errtrace
代わりに ERR でトラップします。例:
trap onerr ERR
例
ゼロ ステータスの例:
$ true; echo $?
0
ゼロ以外のステータスの例:
$ false; echo $?
1
否定ステータスの例:
$ ! false; echo $?
0
$ false || true; echo $?
0
pipefail
でテスト 無効化:
$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1
pipefail
でテスト 有効化:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1
set -e
が原因で中止されたスクリプトの終了ステータスを把握しようとしているときに、この投稿を見つけました。 .答えは私には明らかではありませんでした。したがって、この答え。基本的に、set -e
コマンド (例:シェル スクリプト) の実行を中止し、失敗したコマンドの終了ステータス コードを返します (例:外側のスクリプトではなく、内側のスクリプト) .
たとえば、シェル スクリプト outer-test.sh
があるとします。 :
#!/bin/sh
set -e
./inner-test.sh
exit 62;
inner-test.sh
のコード です:
#!/bin/sh
exit 26;
outer-script.sh
を実行すると コマンド ラインから、外側のスクリプトは内側のスクリプトの終了コードで終了します:
$ ./outer-test.sh
$ echo $?
26