Bash
如果命令成功則退出 bash 腳本
我有一些簡單的冒煙測試腳本,通常看起來像:
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
在執行 、 、 或保留字之後的複合列表while
、until
以if
保留elif
字**開頭****的管道!
**或除最後一個以外的任何 AND-OR 列表命令時,該設置應被忽略。