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

Linux 未找到包时打印错误消息的Shell脚本,linux,bash,shell,console-output,Linux,Bash,Shell,Console Output,我正在编写一个shell脚本,在执行任何操作之前,我需要检查是否安装了一些依赖项。我发现我可以使用哪个来查看它是否已安装。问题是,当找不到该依赖项时,它会将以下错误抛出到控制台的输出中: 其中:没有abc(/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:…) 我希望

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

其中:没有abc(/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:…)
我希望避免这样的输出,因为我已经在出现故障时显示了错误消息。我怎样才能避免写任何东西

功能已安装(){
如果[[!$(哪一个$1)]]
然后
echo“[错误]:$1$2”
出口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
}

如果我这样做,条件语句将停止工作,并且不再标识任何已安装的包。在编辑中为您替换了上面的代码。也不工作,因为
set-euo pipefail
头,脚本会突然停止,而不显示任何错误消息。那么为什么要设置它?如果你有这一套,那么是的,你会遇到问题。但是您需要
的退出状态,如果您有这些设置,那么您将无法获得它。为什么不在测试需求之后设置管道文件等呢?或者这些问题都不能回答我的问题。我想避免在找不到任何东西时抛出错误,通过我自己的错误跟踪,我已经知道如何找到路径。如果您删除该问题的负面反馈,我将不胜感激,因为它不是重复的。
哪个
仍然是错误的解决方案,除非您专门锁定您确切知道的平台
,哪个
。便携式POSIX解决方案是
命令
(或者可能是
类型
)。看见