Bash

有沒有辦法讓我的 bash 腳本中的函式在任何命令錯誤時自動執行?

  • January 9, 2017

我正在編寫一個需要執行一系列命令的 shell 腳本,並且每個命令都依賴於之前的每個命令。如果任何命令失敗,整個腳本都應該失敗,我呼叫一個退出函式。我可以檢查每個命令的退出程式碼,但我想知道是否有可以啟用的模式或讓 bash 自動執行此操作的方法。

例如,使用以下命令:

cd foo || myfunc
rm a || myfunc
cd bar || myfunc
rm b || myfunc

有沒有一種方法可以讓我在執行這些命令之前以某種方式向 shell 發出信號,如果它們中的任何一個失敗,它應該呼叫 myfunc ,這樣我就可以寫一些更乾淨的東西,比如:

cd foo
rm a
cd bar
rm b

如果任何命令返回的狀態大於零,您可以使用 bash陷阱 ERR使腳本退出,並在退出時執行您的函式。

就像是:

myfunc() {
 echo 'Error raised. Exiting!'
}

trap 'myfunc' ERR

# file does not exist, causing error
ls asd
echo 123

請注意,bash 陷阱 ERR確實是隱式的set -o errexit,或者set -e不是 POSIX。

ERR如果失敗的命令是緊跟在untilorwhile關鍵字之後的命令列表的一部分、在iforelif保留字之後的測試的一部分、在&&or||列表中執行的命令的一部分,或者如果命令的返回狀態正在反轉,則陷阱不會執行!.

引用自:https://unix.stackexchange.com/questions/172685