私は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は発生しません。falseexit 1