私はbashスクリプトを書いていますが、最初のエラーでクラッシュさせたいのですが。ただし、以下で簡略化した特定の状況では、これを実行することはできません。
#!/bin/bash
set -Exu
bad_command() {
false
#exit 1
echo "NO!!"
}
(set -o pipefail; bad_command | cat ; echo "${PIPESTATUS[@]}; $?") || false
echo "NOO!!"
予想される動作は、bad_command
サブシェルのクラッシュ、()
サブシェルのクラッシュへの伝播、外部シェルのクラッシュへの伝播です。しかし、これらはいずれもクラッシュせず、両方のNOが出力されます(!?)
ステートメントのコメントを外すとexit 1
、NOは出力されなくなりますが、NOOはまだ出力されます(!?)
3つのシェルのそれぞれの内部で明示的に使用してset -e
みました(関数の最初の行、後の最初のステートメント(
ですが、変更はありません。
注:()
これはより複雑なスクリプトを単純化したものであるため、サブシェル内でパイプを実行する必要があります。サブシェルがないと、すべてが期待どおりに機能し、またはのいずれか()
でNOは発生しません。false
exit 1