bash避免"命令未找到"错误回声

时间:2017-11-30 09:20:00

标签: bash shell command-line scripting

我开发了一个脚本,用一个命令向我显示我的工具版本
代码:link to github repo

结果摘要:

###############################################
########## versions (alphabetically) ##########
###############################################
bash:          3.2.57(2)-release`<br>
java:          1.7.0`<br>
/export/home/zmbf8bl/.mw701/10_scripts_tools/versions/versions.sh: line 137: npm: command not found`<br>
/export/home/zmbf8bl/.mw701/10_scripts_tools/versions/versions.sh: line 146: node: command not found`<br>
zsh:           4.3.6`<br>
###############################################


特殊的行为应该是,如果一个工具不可用,脚本就不会打印任何关于它的信息。在Windows和macOS上工作,但不在Linux上 Linux打印输出例如npm: command not found

如果我的机器上没有工具(例如npm),我该如何避免出现此错误消息并且不打印任何内容?

非常感谢!

3 个答案:

答案 0 :(得分:2)

只需替换

2>&1 

代码中的

2>/dev/null

一般来说,命令未找到错误是打印到stderr 当你进行版本检查时,将stderr重定向到/ dev / null 那么你只会获得stdout信息

答案 1 :(得分:1)

要检查$ PATH中是否存在该命令,请执行

checkCommand () {
    if command -v "$1" >/dev/null; then
        : # OK command exists
    else
        echo >&2 "$1: no such command"
        return 1
    fi
}

if checkCommand npm; then ...

答案 2 :(得分:0)

有几种方法可以实现这一点,你可以明确地使用类似type命令的东西,如果你知道你可以测试的完整路径,如果文件存在并且你有执行访问权限(-x) ,或者你可以使用if

#!/bin/bash

if ! npm arg1 arg2
   if (( ? != 127 ))
   then
      echo "npm failed $?"
   fi
fi

如果找不到命令,Bash返回127。

编辑:您仍然会收到command not found错误消息,但它不会停止您的计划。忽略所有错误消息的问题是,如果程序运行但以其他方式失败,您将丢失错误消息,并且您不知道它为什么不起作用。