Shell

無法連結命令時如何獲得連結命令的效果?

  • January 18, 2018

我只想在前一個命令成功的情況下按順序執行一系列命令。根據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()

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