2011-10-07 92 views
2

我需要編寫腳本來測試命令blablabla是否存在於類路徑中。所以我寫了下面的代碼:Shell腳本在bash中工作,但不在ksh中

if ! hash blablabla >/dev/null 2>&1; then 
    echo not found 
fi 

這在腳本在bash中執行時工作正常。但是,如果我嘗試在KSH,那麼它不工作:

#! /usr/bin/ksh 

if ! hash blablabla >/dev/null 2>&1; then 
    echo not found 
fi 

我希望echo not found被執行,而是我什麼也沒得到。有什麼問題?

回答

3

我相信命令是便攜式的(如果該事項):

command -v -- some_command >/dev/null 2>&1 || 
    printf '%s\n' "not found" 
+1

'類型'也是便攜的 –

+0

@glenn jackman,是的,謝謝你指出。一些shell將它作爲別名來實現,但它是標準的。 –

3

在bash hash是一個內置的命令。在ksh中,它是一個別名;別名在shell腳本中不活動。

alias hash='alias -t --' 

嘗試which命令,該命令是一個外部命令,因此殼無關:

if ! which -s blablabla; then 
    echo not found >&2 
fi 
+0

你說得對有關哈希是對KSH的別名。謝謝(你的)信息!但不幸的是,哪個命令在我使用的服務器中沒有-s。 – hooray

0

臨屋hash命令是內置命令在bash,但不是在ksh的殼。您可能需要改用whence

if ! whence blah; then print urgh; fi 
+0

哪個只適用於ksh。我也需要它在bash上工作。 – hooray

+0

@Rodrigo:爲什麼?你在寫腳本嗎?在這種情況下,只需在頂部使用hash-bang('#!')指定運行腳本的shell,例如'#!/ bin/ksh'就可以使用Korn shell。我將不同的shell視爲不同的編程語言。這樣我就不會嘗試製作[polyglot](http://en.wikipedia.org/wiki/Polyglot_(計算))程序。這往往會使腳本更清潔。 – Kusalananda