我正在运行一个始终打印输出的命令。我想只在命令失败时看到输出。
这样的事情:
% (echo OK; true) | FILTER
% (echo ERROR; false) | FILTER
ERROR
可以使用标准shell工具实现FILTER
吗?
结构不一定是管道。像FILTER "my_command"
这样的东西就可以了。
P.S。实际程序是使用Google测试套件实现的单元测试。它总是很冗长,如果成功,输出就不那么有趣了。
答案 0 :(得分:3)
您可以使用以下命令将stdout重定向到/ dev / null:
command 1>/dev/null
这样,只显示错误消息。
答案 1 :(得分:2)
你 DONT 在你的情况下需要一个子shell,如下所示,命令集的退出代码(由';'分隔的命令列表)是退出代码集合中的最后一个命令。因此,最后只有
true
或false
在您的示例中很重要。无关紧要之前的命令。
执行此操作的最佳方法是使用命令替换($()
),将输出捕获到变量并使用shell内置||
运算符,该运算符运行后续命令仅当前一个命令的返回码失败时。
var=$(echo ERROR); false || printf "%s\n" "$var"
ERROR
var=$(echo ERROR); true || printf "%s\n" "$var"
上述条款的反面是
var=$(echo ERROR); true && printf "%s\n" "$var"
ERROR
var=$(echo ERROR); false && printf "%s\n" "$var"
查看man
页面对COMMAND LISTS
AND和OR列表分别是由
&&
和||
控制运算符分隔的一个或多个管道的序列。AND
和OR
列表以左关联性执行。 AND列表的格式为当且仅当 command1 返回退出状态为零时,才会执行command1 && command2
command2 。 OR列表的格式为
当且仅当 command1 返回非零退出状态时,才会执行command1 || command2
command2 。 AND和OR列表的返回状态是列表中执行的最后一个命令的退出状态。