问题描述
我正在编写一个 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
}