Shell

從子shell退出shell腳本

  • December 10, 2018

考慮這個片段:

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 -EERR陷阱結合使用有點像 的改進版本,set -e因為它允許您定義自己的錯誤處理。

在zsh中,ERR陷阱是自動繼承的,所以不需要set -E,也可以將trap定義為TRAPERR()函式,通過修改$functions[TRAPERR],比如functions[TRAPERR]="echo was here; $functions[TRAPERR]"

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