2011-10-07 89 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