bash - 为什么重定向输出时测试退出状态不起作用?
问题描述
我一直在测试 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
当找不到要执行的文件时,它应该已经返回非零状态。
which pacman &> /dev/null && echo pacman
推荐阅读
- node.js - 将 Mongoose 结果推入数组
- asp.net-mvc - DataSource.Read prevents BindTo for Kendo ComboBox
- ntp - 通过运行命令 sudo ntpd -gq 使用 ntp 同步时出错
- javascript - 木偶水平滚动不起作用
- android - 显示键盘时如何向上滚动屏幕?
- python - How to check equivalence of two XML documents?
- microsoft-cognitive - 即使设置正确,Azure Webbot 也无法连接到 QnA maker 知识库
- linux - 如何从文件中读取行并根据逗号分隔并分配变量名对其进行拆分
- jquery - 如果图表只有一个,它会占据整个空闲空间
- browser - 将默认浏览器导航到同一选项卡中的新 URL