You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本使用which检查依赖时如何屏蔽其默认错误输出

解决方案

你遇到的问题是which命令的错误信息会输出到标准错误流(stderr,文件描述符2),你当前的写法只捕获了标准输出(stdout,文件描述符1)的内容,所以错误信息会直接打印到控制台。

方案1:直接修改现有逻辑(兼容你当前的写法)

只需要将which的错误输出重定向到空设备/dev/null即可,修改后的函数如下:

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

注意给$1加上双引号,避免依赖名带空格时出现解析错误。

方案2:更推荐的POSIX兼容写法

which本身不属于POSIX标准,不同发行版的实现逻辑有差异,部分系统的which甚至是别名,可能出现非预期行为。更推荐用command -v来做依赖校验,它是POSIX规定的内置命令,性能更好,默认不会输出多余错误:

function is_installed() {
  # 只判断命令退出码,不需要捕获输出,执行效率更高
  if ! command -v "$1" >/dev/null 2>&1
  then
    echo "[ERROR]: $1 $2"
    exit 1
  fi
}
  • >/dev/null:屏蔽命令的标准输出
  • 2>&1:将标准错误重定向到标准输出,一起丢入空设备

内容的提问来源于stack exchange,提问作者Pablo Acereda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 07:45:03