找不到包时打印错误消息的 Shell 脚本

问题描述

我正在编写一个 shell 脚本,我需要在执行任何操作之前检查是否安装了一些依赖项。我发现我可以使用 which <package> 来查看它是否已安装。问题在于,当找不到该依赖项时,它会在控制台的输出中抛出以下错误

which: no abc in (/home/pace/.emacs.d/bin:/usr/local/bin:/home/pace/.emacs.d/bin:/usr/local/bin:/home/pace/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:...)

我想避免出现这样的输出,因为我已经在出现故障时显示错误消息。我怎样才能避免which写任何东西?

function is_installed() {
  if [[ ! $(which $1) ]]
  then
    echo "[ERROR]: $1 $2"
    exit 1
  fi
}

解决方法

好吧,可能有更好的方法来做您想做的事情(我不确定“最佳”方法),但是您可以重定向 stderr 和 stdout 以隐藏输出中的结果:>

function is_installed() {
  if [[ ! $(which $1 > /dev/null 2>&1 ) ]]
  then
    echo "[ERROR]: $1 $2"
    exit 1
  fi
}

(最近版本的 bash 也支持使用 >& /dev/null 来同时执行这两个操作,但上面的方法更便于移植)

编辑——试试这个

function is_installed() {
  which $1 > /dev/null 2>&1
  if [ $? = 1 ] ; then
    echo "[ERROR]: $1 $2"
    exit 1
  fi
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...