Shell脚本在bash中工作,但不在ksh中
我需要编写脚本来测试命令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
被执行,而是我什么也没得到。有什么问题?
我相信命令是便携式的(如果该事项):
command -v -- some_command >/dev/null 2>&1 ||
printf '%s\n' "not found"
在bash hash
是一个内置的命令。在ksh中,它是一个别名;别名在shell脚本中不活动。
alias hash='alias -t --'
尝试which
命令,该命令是一个外部命令,因此壳无关:
if ! which -s blablabla; then
echo not found >&2
fi
你说得对有关哈希是对KSH的别名。谢谢(你的)信息!但不幸的是,哪个命令在我使用的服务器中没有-s。 – hooray
临屋hash
命令是内置命令在bash
,但不是在ksh
的壳。您可能需要改用whence
。
if ! whence blah; then print urgh; fi
哪个只适用于ksh。我也需要它在bash上工作。 – hooray
@Rodrigo:为什么?你在写脚本吗?在这种情况下,只需在顶部使用hash-bang('#!')指定运行脚本的shell,例如'#!/ bin/ksh'就可以使用Korn shell。我将不同的shell视为不同的编程语言。这样我就不会尝试制作[polyglot](http://en.wikipedia.org/wiki/Polyglot_(计算))程序。这往往会使脚本更清洁。 – Kusalananda
'类型'也是便携的 –
@glenn jackman,是的,谢谢你指出。一些shell将它作为别名来实现,但它是标准的。 –