【问题标题】:bash avoid "command not found" error echobash 避免“找不到命令”错误回显
【发布时间】:2018-05-14 04:00:29
【问题描述】:

我开发了一个脚本,它通过一个命令显示我的工具版本。

代码: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),如何避免此错误消息并且不打印任何内容???

非常感谢!

【问题讨论】:

  • 请不要发布链接,将您的代码发布为文本。
  • 呃,如果你在调用之前检查一个命令是否存在呢?

标签: bash shell command-line scripting


【解决方案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】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      只是替换

      2>&1 
      

      在您的代码中使用

      2>/dev/null
      

      一般来说,command not found 错误是打印到stderr 当您进行版本检查时,将 stderr 重定向到 /dev/null 那么你只会得到标准输出信息

      【讨论】:

      • 忽略所有错误消息的问题是,如果程序运行但以其他方式失败,您将丢失错误消息,您将不知道它为什么不起作用。
      • 用grep -v怎么样,像这样,gulp -v 2>&1 |grep -v 'command not found'
      • 可以使用grep -v,但我个人尽量避免不必要的子进程(grep 是一个外部程序,而不是内置的shell)。
      • 但我看到 grep 在您的代码中多次使用,例如 &1 | grep -i 'bash' | cut -d " " -f 4))" >>>
      • @LiQlang.Feng - 不在我的代码中,我正在尝试解决这个问题。我不会为此使用grepcut,我会使用bash 字符串扩展。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      相关资源
      最近更新 更多