GNU/Linux >> Linux の 問題 >  >> Linux

`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
$

最初の例はまだ実行中です!をエコーし​​ます 、しかし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つ以上のパイプラインのシーケンスです
」と「|| 「。


Linux
  1. コマンドライン引数をBashスクリプトに渡しますか?

  2. BashスクリプトのRmコマンドは変数では機能しませんか?

  3. Ctrl + cでBashスクリプトを停止できませんか?

  1. 時間コマンドでBashスクリプトの実行にかかる時間を確認する

  2. bash シェル スクリプトを別のコマンド ライン プログラムと対話させることは可能ですか?

  3. bash.sh で cron を実行する権限が拒否されました

  1. Bash の「test」コマンドでの「&&」と「&」の比較

  2. bash スクリプトを使用して $PYTHONPATH に追加する

  3. bashスクリプトでpythonスクリプトを強制終了する方法