如何在 bash 函數內部斷言而不考慮邏輯檢查?

如何在 bash 函數內部斷言而不考慮邏輯檢查?

我想為我的 bash 腳本實作一個全域陷阱,當出現任何問題時我會觸發該陷阱。問題是,如果我有一個 if 子句正在評估作為謂詞的函數,並且在評估該謂詞時出現故障,則不會呼叫陷阱。我知道如果謂詞回傳 false,則不會呼叫陷阱,但我沒想到計算謂詞的邏輯也會停用陷阱。我對行為的解釋是否正確?

例如,

$ 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失敗的任何邏輯(例如對 的呼叫)應該觸發陷阱?fooreturn 0;

相關內容