Bash

如果命令成功則退出 bash 腳本

  • January 22, 2022

我有一些簡單的冒煙測試腳本,通常看起來像:

set -e

run-command
run-other-command

echo ok

當我期望命令成功時,這很有效;如果有任何失敗,set -e將使用非零退出程式碼提前退出腳本。

但是有時我希望命令失敗,並且我希望腳本以其他方式退出(即,如果命令以程式碼 0 退出)。我原以為我可以寫:

set -e
run-command-that-succeeds
! run-command-that-fails

但這忽略了退出程式碼。bash 手冊頁這樣說set -e

外殼不退出

$$ … $$如果命令的返回值用 ! 反轉

可行的替代方案是:

set -e
! run-command-that-fails
[[ $? -eq 0 ]]

set -e
if run-command-that-fails; then
 exit 1
fi

這些是最好的選擇嗎,或者如果命令成功,是否有更慣用的替代方法來退出?

我的測試表明這(! run-command-that-fails)是一個解決方案。這run-command-that-fails在子shell中執行。

如果您run-command-that-fails出於某種原因需要在主 shell 中執行,那麼您需要另一種解決方案。我注意到這不是{ ! run-command-that-fails; }一個解決方案。

如果你完全放棄它會更容易set -e,而是使用類似的東西

should-fail    && exit 1
should-succeed || exit 1

在上面的程式碼中,should-fail預計會失敗,如果失敗,腳本會以非零退出程式碼退出。

第二個預計會成功,如果不成功,腳本將退出。

或者,如果您希望在使用 AND-OR-lists 時保持一致,

! should-fail  || exit 1
should-succeed || exit 1 

或者

should-fail      && exit 1
! should-succeed && exit 1

對於任何需要的不僅僅是簡單的exit,如果它失敗了,我會使用

if should-fail; then
   # handle failure in test
   exit 1
fi

if ! should-succeed; then
   # handle failure in test
   exit 1
fi

正如您已經註意到的那樣,在set -e活動狀態下,如果命令的退出狀態由 反轉,shell 不會退出!。這是 POSIX 的要求。以下是特殊內置實用程序的 POSIX 規範set,我強調:

-e在執行 、 、 或保留字之後的複合列表whileuntilif保留elif字**開頭****的管道!**或除最後一個以外的任何 AND-OR 列表命令時,該設置應被忽略。

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