【问题标题】:Shell script which prints error message when package not found [duplicate]找不到包时打印错误消息的Shell脚本[重复]
【发布时间】:2021-08-18 03:45:19
【问题描述】:

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

【问题讨论】:

  • 这些问题都没有回答我的问题。我想避免在找不到任何东西时抛出错误,并且通过我自己的错误跟踪,我已经知道如何找到路径。如果您删除问题的负面反馈,我将不胜感激,因为它不是重复的。
  • which 仍然是错误的解决方案,除非您专门固定到您确切知道 which which 的平台。可移植的 POSIX 解决方案是 command(或者可能是 type)。见unix.stackexchange.com/questions/85249/…

标签: linux bash shell console-output


【解决方案1】:

好吧,可能有更好的方法来做你想做的事情(我不确定“最好”的方法),但你可以重定向 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 标头,脚本会突然停止而不显示任何错误消息。
  • 那你为什么要设置呢?如果你有那个设置,那么是的,你会遇到问题。但是您需要which 的退出状态,如果您有这些设置,那么您将无法获得它。测试需求后为什么不设置管道文件等?
猜你喜欢
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2019-08-20
相关资源
最近更新 更多