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

Posted

技术标签:

【中文标题】为啥重定向输出时测试退出状态不起作用?【英文标题】:Why doesn't testing exit status work when output is redirected?为什么重定向输出时测试退出状态不起作用? 【发布时间】:2021-05-12 15:41:56 【问题描述】:

我一直在测试bash,发现如下代码:

#!/bin/bash

[[ `which pacman` ]] && echo pacman
[[ `which apt-get` ]] && echo apt-get

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

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

所以我想出了以下代码:

#!/bin/bash

[[ `which pacman >/dev/null 2>&1` ]] && echo pacman
[[ `which apt-get >/dev/null 2>&1` ]] && echo apt-get

但这不会输出任何东西。当我像这样在命令行上运行每个命令时:

which pacman >/dev/null 2>&1 && echo $?

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

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

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

【问题讨论】:

【参考方案1】:

[[ ... ]] 没有指定的测试运行 [[ -n ... ]]。在这种情况下,它会测试捕获的输出是否为非空。但是如果你把所有东西都重定向到/dev/null,那么输出确实是空的!

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

which pacman &> /dev/null && echo pacman

【讨论】:

理解这一点。

以上是关于为啥重定向输出时测试退出状态不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥页面重定向在 php 中不起作用

为啥这个 .htaccess 重定向不起作用?

为啥我的 .htaccess 301 重定向规则不起作用?

将 sed 的输出重定向到文件时,sudo 不起作用[重复]

为啥即使我调用 UseHttpsRedirection ASP.NET Core 重定向也不起作用?

使用系统命令将stdout和stderr输出重定向到文件在perl中不起作用[重复]