k.sh
:
if ! [ -x "$(command -v nvm)" ]; then
echo 'Error: nvm is not installed' >&2
else
echo 'nvm installed'
fi
端子:
km@Karl ~/dev/cac (master) $ nvm --version
0.33.2
km@Karl ~/dev/cac (master) $ . k.sh
Error: nvm is not installed
我想让bash检查命令是否存在! NVM来自.bash_profile
和.bashrc
。
答案 0 :(得分:2)
[ -x ]
测试文件是否存在并且可执行。如果传递外壳函数或别名的名称,它将失败。真正不需要额外的检查。只需检查command
是否成功就可以了。
if ! command -v nvm &> /dev/null
答案 1 :(得分:1)
hash
对我来说是最便携的:
if hash nvm 2>/dev/null; then echo exists; else echo does not exist; fi
为什么不起作用?让我们看看您的工作:
command -v nvm
#不打印任何内容,并以1退出。
$(command -v nvm)
#不输出任何内容,并以1退出。
[ -x "$(command -v nvm)" ]
命令的退出状态将被忽略。仅命令返回的字符串很重要。这样执行:
[ -x "" ]
测试命令以状态1退出,因为文件""
不是可执行文件(该文件不存在)。
! [ -x "" ]
,然后您取消返回状态,因此它返回0,即true
如果要使用-v命令检查文件是否存在,请检查其返回状态,而不是字符串:
if command -v nvm 2>/dev/null; then echo exists; else echo does not exist; fi
但是散列更具可移植性,更好地坚持使用散列。