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つ以上のパイプラインのシーケンスです
」と「||「。