ロジックチェックに関係なく、bash 関数内でアサートするにはどうすればよいですか?

ロジックチェックに関係なく、bash 関数内でアサートするにはどうすればよいですか?

何かが失敗したときに起動するグローバル トラップを bash スクリプトに実装したいと思います。問題は、述語である関数を評価する if 句があり、その述語を評価中にエラーが発生すると、トラップが呼び出されないことです。述語が false を返すとトラップが呼び出されないことは理解していますが、述語を計算するロジックでもトラップが無効になっているとは思っていませんでした。動作の私の解釈は正しいですか。また、述語を計算するロジックで bash にトラップを呼び出させる方法はありますか。

例えば、

$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1

ここまでは順調です。トラップを定義し、失敗があればトラップをトリガーし、すべての関数がトラップを継承するように要求します。次に、barwhich を呼び出して、fooそれが失敗し、トラップを起動し、エラー コードを出力します1

$ if bar; then echo true; fi
true

これは予想外です。出力は であると予想していました1。 からの戻りコードのみが考慮から除外されると思っていました。実際に起こっていることは、内barのすべてのロジックがbarまた考慮から除外されました。これは bash の動作方法なのでしょうか?最後のステートメント (例: ) の前に内のロジックbarが失敗する (例: の呼び出し) 場合にトラップをトリガーするように指定する方法はありますか?fooreturn 0;

関連情報