私は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
テストの一部である場合、シェルは終了しません。if
elif
&&
または、||
リストから実行されるコマンドの一部&&
最後または次のコマンドを除いて||
、最後のコマンドを除くパイプライン内のすべてのコマンド、または戻り値と同じコマンド!
。
]
しかもPOSIXシェルコマンド言語仕様 これが正しい動作であることを確認してください。
、または予約語の複合リスト
-e
、予約語で始まるパイプ、または最後のエントリを除くすべてのAND-ORリストに従うコマンドを実行する場合、この設定は無視する必要があります。while
until
if
elif
!
そしてセクション2.9.3リストこのファイルの定義
&&
AND-ORリストは、""と""演算子で区切られた1つ以上のパイプシーケンスです||
。