为什么输出重定向时测试退出状态不起作用?

Dea*_*nie 0 bash exit-code io-redirection

我对bash进行了测试,发现了以下代码:

#!/bin/bash

[[ `which pacman` ]] && echo pacman
[[ `which apt-get` ]] && echo apt-get
Run Code Online (Sandbox Code Playgroud)

它将测试安装了什么包管理器并回显它。

在某些系统上,失败的which命令会将错误打印到stderr. 我想抑制which命令的所有输出。

所以我想出了以下代码:

#!/bin/bash

[[ `which pacman >/dev/null 2>&1` ]] && echo pacman
[[ `which apt-get >/dev/null 2>&1` ]] && echo apt-get
Run Code Online (Sandbox Code Playgroud)

但这不会输出任何内容。当我在命令行上运行每个命令时,如下所示:

which pacman >/dev/null 2>&1 && echo $?
Run Code Online (Sandbox Code Playgroud)

在带有 的系统上pacman,它会打印0它应该打印的内容。这&&也证明前面的命令成功了。

那么为什么重定向代码不像在命令行上那样工作呢?我可以在脚本中添加什么以使其正常工作?

这对我来说真的很困惑,因为我以前从未遇到过此类问题。通常,任何在命令行上运行的命令也应该在 bash 脚本中运行,不是吗?

cho*_*oba 5

[[ ... ]]没有指定的测试运行[[ -n ... ]]。在这种情况下,它测试捕获的输出是否非空。但如果将所有内容重定向到 /dev/null,输出确实是空的!

您不需要捕获输出。which当找不到要执行的文件时,应该已经返回非零状态。

which pacman &> /dev/null && echo pacman
Run Code Online (Sandbox Code Playgroud)