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
$
最初の例はまだ実行中です!
をエコーします 、しかし2番目のものはそうではありません。なぜそれらは異なった振る舞いをするのですか?
UPD。同様の質問:https://stackoverflow.com/questions/6930295/set-e-and-short-tests
承認された回答:
これは文書化された動作です。
bash(1)のマニュアルページには、 set-e
が記載されています 、
失敗したコマンドが
コマンドリストの一部である場合while
の直後にある場合、シェルは終了しません。 またはuntil
キーワード、
if
に続くテストの一部 またはelif
予約語、&&
で実行されるコマンドの一部 または||
リスト 最後の&&
に続くコマンドを除く または||
、
パイプライン内の最後のコマンド以外のコマンド、
または、コマンドの戻り値が!
で反転されている場合 。
[強調が追加されました。]
そして、POSIXシェルコマンド言語 仕様により、これが正しい動作であることが確認されています:
-e
whileの後に複合リストを実行する場合は
設定を無視します。 、until
、if
、またはelif
予約語、
!
で始まるパイプライン 予約語、
または最後以外のAND-ORリストの任意のコマンド。
およびセクション2.9.3リスト そのドキュメントの定義
AND-ORリストは、演算子「
&&
」で区切られた1つ以上のパイプラインのシーケンスです
」と「||
「。