Shell
從子shell退出shell腳本
考慮這個片段:
stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi }
通常,當
func
被呼叫時,它將導致腳本終止,這是預期的行為。但是,如果它在子 shell 中執行,例如在result=`func`
它不會退出腳本。這意味著呼叫程式碼每次都必須檢查函式的退出狀態。有沒有辦法避免這種情況?這
set -e
是為了什麼?
您可以
kill $$
在呼叫之前殺死原來的 shell ( )exit
,這可能會奏效。但:
- 對我來說似乎很醜
- 如果您在那裡有第二個子shell,它將中斷,即在子shell 中使用子shell。
相反,您可以使用幾種方法之一來傳回 Bash FAQ 中的值。不幸的是,它們中的大多數都不是很好。您可能只是在每次函式呼叫後檢查錯誤(
-e
有很多問題)。要麼,要麼切換到 Perl。
例如,您可以決定退出狀態 77 意味著退出任何級別的子外殼,然後執行
set -E trap '[ "$?" -ne 77 ] || exit 77' ERR ( echo here ( echo there ( exit 12 # not 77, exit only this subshell ) echo ici exit 77 # exit all subshells ) echo not here ) echo not here either
set -E
與ERR
陷阱結合使用有點像 的改進版本,set -e
因為它允許您定義自己的錯誤處理。在zsh中,ERR陷阱是自動繼承的,所以不需要
set -E
,也可以將trap定義為TRAPERR()
函式,通過修改$functions[TRAPERR]
,比如functions[TRAPERR]="echo was here; $functions[TRAPERR]"