`set -e` を使用する Bash スクリプトは `...&&...` コマンドで停止しません。

`set -e` を使用する Bash スクリプトは `...&&...` コマンドで停止しません。

私はset -e慣れている最初のエラーが発生したときにbashスクリプトを停止する

次のコマンドを使用する場合を除いて、すべてがうまく機能します&&

$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$

比較:

$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$

最初の例はまだechoですが、I'm running!2番目の例はそうではありません。なぜ彼らは異なって行動するのですか?

UPD。エマルジョン:https://stackoverflow.com/questions/6930295/set-e-and-short-tests

ベストアンサー1

これは文書化された動作です。これbash(1) マニュアルページいわばset -e

while失敗したコマンドがキーワードの直後のコマンドリストの一部であるか、予約語の直後の untilテストの一部である場合、シェルは終了しません。ifelif&&または、||リストから実行されるコマンドの一部&&最後または次のコマンドを除いて|| 、最後のコマンドを除くパイプライン内のすべてのコマンド、または戻り値と同じコマンド!
]

しかもPOSIXシェルコマンド言語仕様 これが正しい動作であることを確認してください。

、または予約語の複合リスト-e、予約語で始まるパイプ、または最後のエントリを除くすべてのAND-ORリストに従うコマンドを実行する場合、この設定は無視する必要があります。whileuntilifelif!

そしてセクション2.9.3リストこのファイルの定義

&&AND-ORリストは、""と""演算子で区切られた1つ以上のパイプシーケンスです||

おすすめ記事