だから私はこれを読みました: `set -e` を使用する Bash スクリプトは `...&&...` コマンドで停止しません。
これは意味があります。今質問は次のとおりです。
テストA:
$ cat ./test.sh
set -ex
source foo && true
echo 'running'
$ ./test.sh
++ source foo
./test.sh: line 16: foo: No such file or directory
$ echo $?
1
テストB:
$ cat ./test.sh
set -ex
cat foo && true
echo 'running'
$ ./test.sh
++ cat foo
cat: foo: No such file or directory
++ echo running
running
$ echo $?
0
source
この規則に違反した唯一の理由は何ですか?勇敢な)?
失敗したコマンドが while キーワードまたは Until キーワードの直後のコマンド・リストの一部であるか、if または elif 予約語の後のテストの一部である場合、シェルは終了しません。最後の&&の後に続くコマンドを除いて、&&または||リストの一部として実行されるすべてのコマンドまたは||、最後のコマンドを除くパイプライン内のすべてのコマンド、または!に反転したコマンドの戻り値。
答え1
source
.
は、いわゆるドット命令と呼ばれるドット命令のエイリアスですspecial command
。ここで、POSIX は、これらのコマンドをエラー発生時に非対話型シェル全体をシャットダウンすることを説明します。
以下でコマンドを呼び出す場合:
bash test.sh
bashは終了しませんが、呼び出すとき:
bash -o posix test.sh
終了します。したがって、bashはデフォルトでPOSIX互換でコンパイルされているか、実際にbashとは異なるシェルを呼び出しています。
バラよりhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14標準として。