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