何かが失敗したときに起動するグローバル トラップを bash スクリプトに実装したいと思います。問題は、述語である関数を評価する if 句があり、その述語を評価中にエラーが発生すると、トラップが呼び出されないことです。述語が false を返すとトラップが呼び出されないことは理解していますが、述語を計算するロジックでもトラップが無効になっているとは思っていませんでした。動作の私の解釈は正しいですか。また、述語を計算するロジックで bash にトラップを呼び出させる方法はありますか。
例えば、
$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1
ここまでは順調です。トラップを定義し、失敗があればトラップをトリガーし、すべての関数がトラップを継承するように要求します。次に、bar
which を呼び出して、foo
それが失敗し、トラップを起動し、エラー コードを出力します1
。
$ if bar; then echo true; fi
true
これは予想外です。出力は であると予想していました1
。 からの戻りコードのみが考慮から除外されると思っていました。実際に起こっていることは、内bar
のすべてのロジックがbar
また考慮から除外されました。これは bash の動作方法なのでしょうか?最後のステートメント (例: ) の前に内のロジックbar
が失敗する (例: の呼び出し) 場合にトラップをトリガーするように指定する方法はありますか?foo
return 0;