为什么在重定向输出时测试退出状态不起作用?
Why doesn't testing exit status work when output is redirected?
我一直在测试 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 脚本中运行,不是吗?
[[ ... ]]
没有指定的测试运行 [[ -n ... ]]
。在这种情况下,它会测试捕获的输出是否为非空。但是如果你把所有的东西都重定向到/dev/null,输出确实是空的!
您不需要捕获输出。当找不到要执行的文件时,which
应该已经 return 一个非零状态。
which pacman &> /dev/null && echo pacman
我一直在测试 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 脚本中运行,不是吗?
[[ ... ]]
没有指定的测试运行 [[ -n ... ]]
。在这种情况下,它会测试捕获的输出是否为非空。但是如果你把所有的东西都重定向到/dev/null,输出确实是空的!
您不需要捕获输出。当找不到要执行的文件时,which
应该已经 return 一个非零状态。
which pacman &> /dev/null && echo pacman