如何執行命令,如果失敗則執行另一個命令並返回1?

如何執行命令,如果失敗則執行另一個命令並返回1?

我已經習慣了其他語言中的這種風格:

do_something || (log_error; return 1) # do something, and if that fails, log the error and then return 1 no matter what, even if the logging fails.

但我似乎在 bash 中找不到等效的東西。問題在於括號的工作方式有點像是具有自己作用域的函數,而 return 1 不會具有預期的行為。

這是我到目前為止所擁有的,但它並不完美:

! do_something && log_error && return 1

問題在於!很混亂,傳回 1 取決於日誌記錄是否成功。

這個更好,但更詳細:

do_something || (log_error; return 1) || return 1

有什麼想法嗎?

答案1

使用大括號。

 do_something || { log_error; return 1;}

答案2

最後一次命令運行的退出狀態會保存在$?變數中。因此,您可以執行以下操作:

do something
if [[ $? > 0 ]]; then 
   do log_error; exit 1; 
fi

為了可讀性,我喜歡這樣。然而,你的非常好,你只需要替換&&;

! do_something && log_error ; return 1

&&表示“僅當上一個指令成功退出時才執行下一個指令”,而;just 表示“執行下一個指令”。

相關內容