Shell

/bin/sh 在 if 語句中沒有找到命令時返回 0,這是預期的嗎?

  • February 11, 2018

我編寫了一個 C++ 看門狗,它執行一組腳本來確定該系統是否存在問題。

程式碼有點毛茸茸,這裡就不展示了,但它相當於一個系統呼叫,如下所示:

int const r(system("/bin/sh /path/to/script/test-health"));

r當腳本因if語句中缺少命令而失敗時為 0。腳本有一些令人反感的地方:

set -e
[...]
if unknown_command arg1 arg2
then
[...]

顯然失敗了,unknown_command因為……它是未知的。那時腳本結束,因為我set -e在開始時有。

但是,在這種情況下,退出程式碼將為 0。

在這種情況下,我有辦法獲得退出程式碼 1 嗎?

即問題是檢測錯誤而無需添加測試來知道是否unknown_command存在。我知道該怎麼做:

if ! test -x unknown_command
then
   exit 1
fi

我的觀點是,當我編寫該腳本時,我希望unknown_command在我自己安裝它時存在,但如果出現問題或有人將腳本複製到另一個系統上而不安裝所有內容,我想知道執行時出錯腳本。

根據 POSIX 標準,關於set -e

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

if這意味著在語句中執行未知命令不會導致腳本在執行時終止set -e。或者更確切地說,set -e不會導致它終止。


使用者command -v測試目前是否存在實用程序PATH,除非您使用呼叫的實用程序的完整路徑,在這種情況下,-x測試就足夠了,就像您的問題一樣。

另請參閱: 為什麼不使用“which”?那該用什麼?

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