2013-06-04 59 views
2

我有一系列的命令來執行。但是,只要'找不到命令'就會出現錯誤,我需要退出。所以執行輸出檢查不是一個選項檢測命令在bash腳本中找不到

「$?」 '找不到'命令時,變量等於零。

+0

的[檢查程序從一個bash腳本存在(HTTP可能重複/stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script) – blong

回答

3

如果這應該從一個腳本來完成,這是自然的使用條件來表達這種行爲:/:

asdf 2> /dev/null || exit 1 
+0

這實際上是最簡單和最乾淨的方式,ty – GoTTimw

+0

'ls/this/file/does/not/exist 2>/dev/null'如何? ls命令仍然存在。 – anishsane

+0

@anishsane當然。沒有人說這會排除其他命令失敗的情況。 – 2013-06-04 16:30:44

1

修訂

嘗試

[ -x "$executable" ] && echo "Command '$executable' not found" >&2 && exit 1 

這將寫入錯誤到stderr和退出1個退出代碼。

如果您只有實用程序的名稱您可以使用type內建程序檢查其路徑。

實施例:

type type 
type ls 
type xls 

輸出:

type is a shell builtin 
ls is /usr/bin/ls 
./test.sh: line 13: type: xls: not found 

測試返回1,如果沒有找到效用。

所以如果$executable可以是任何東西(一個內置的,別名,二進制,...),那麼這可以用於:

type -p ls>/dev/null && ls -l 
type -p xls>/dev/null && xls --some_arg 

這將運行ls(任何可執行文件),但不是xls。

無論如何,如果在腳本中沒有設置execfail選項(shopt),那麼腳本將在聲明bash: some_utility: command not found錯誤消息後退出。如果設置了該選項,則繼續。但你可以trap僞信號ERR做什麼,你需要:

shopt -s execfail 
fnc() { echo $?, $_, Oops;} 
trap fnc ERR 

ls -d *|head -2 
xls 
yls 

輸出:

a1 
a2 
./test_tLcn.sh: line 8: xls: command not found 
127, xls, Oops 
./test_tLcn.sh: line 9: yls: command not found 
127, yls, Oops 
+2

這隻有在'$ executable'是您要查找的可執行文件的路徑時纔有效。 '-x'不執行路徑查找。 – chepner

+0

@chapner:你說得對!它不檢測內部bash命令。它可以用例如'type'。 – TrueY

+0

@chapner:我根據你的評論更新了我的答案。請看看它! – TrueY

4

如果沒有找到命令,退出狀態應該是127.但是,你可能會使用bash 4或更高版本,並具有定義的稱爲command_not_found_handle的功能。如果找不到命令,則調用此函數,並且它可能會退出0,屏蔽127代碼。

運行type command_not_found_handle將顯示定義該函數的定義。您可以通過運行unset command_not_found_handle來禁用它。