检查源(.bash_profile)命令是否存在

时间:2018-08-10 10:59:33

标签: bash

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

2 个答案:

答案 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

但是散列更具可移植性,更好地坚持使用散列。