Shell
無法連結命令時如何獲得連結命令的效果?
我只想在前一個命令成功的情況下按順序執行一系列命令。根據Shell 腳本:“set -e”用於錯誤處理的風險:
建議通過將一系列帶有“&&”的命令串在一起來進行自己的錯誤檢查,如下所示:
mkdir abc && cd abc && do_something_else && last_thing || { echo error >&2; exit 1; }
在某些命令之間必須有一些腳本邏輯(例如循環或複雜條件)的情況下,將狀態擷取到變數然後再次使用該變數以確保僅執行其他命令的慣用方法是什麼如果之前的命令成功了?
就像是:
mkdir abc status=$? ... # do stuff (which might alter $?) $status && cd abc status=$? ... # do more stuff $status && do_something_else status=$? ... # do even more $status && last_thing status=$? ... # do final stuff $status || { echo error >&2; exit 1; }
當我寫出這個問題時,我意識到一個可能的解決方案是:
mkdir abc || { echo error >&2; exit 1; } ... # do stuff (which might alter $?) cd abc || { echo error >&2; exit 1; } ... # do more stuff do_something_else || { echo error >&2; exit 1; } ... # do even more last_thing || { echo error >&2; exit 1; } ... # do final stuff
在這種情況下,
$status
甚至不需要變數,並且只有在前面的命令成功時才會執行命令。而且,我也意識到,這是一個die "error message"
函式可以派上用場來回顯錯誤消息並以錯誤程式碼退出。更新
隨著
die
,它將是:die() { echo "$*" >&2; exit 1; } mkdir abc || die "error" ... # do stuff cd abc || die "error" ... # do more stuff do_something_else || die "error" ... # do even more last_thing || die "error" ... # do final stuff
OP 自行提供的答案中的一個稍微乾淨(在我看來)的版本可能是:
bail() { return=${1-1} # if no parameters sent, default to exit code 1 shift echo "$@" 1>&2 exit $return } if mkdir abc; then do_stuff else bail 1 "Unable to create directory" fi if cd abc; then do_stuff else bail 2 "Unable to enter directory" fi # et cetera
else
關鍵是為每個失敗案例提供自己的退出程式碼,並且此構造還允許您在觸發之前在每個子句中進行自己的失敗案例管理bail()
。