管道命令在成功时抑制输出

时间:2017-02-16 08:53:23

标签: bash shell unix

我正在运行一个始终打印输出的命令。我想只在命令失败时看到输出。

这样的事情: % (echo OK; true) | FILTER % (echo ERROR; false) | FILTER ERROR

可以使用标准shell工具实现FILTER吗? 结构不一定是管道。像FILTER "my_command"这样的东西就可以了。

P.S。实际程序是使用Google测试套件实现的单元测试。它总是很冗长,如果成功,输出就不那么有趣了。

2 个答案:

答案 0 :(得分:3)

您可以使用以下命令将stdout重定向到/ dev / null:

command 1>/dev/null

这样,只显示错误消息。

答案 1 :(得分:2)

  

DONT 在你的情况下需要一个子shell,如下所示,命令集的退出代码(由';'分隔的命令列表)是退出代码集合中的最后一个命令。因此,最后只有truefalse在您的示例中很重要。无关紧要之前的命令。

执行此操作的最佳方法是使用命令替换($()),将输出捕获到变量并使用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列表分别是由&&||控制运算符分隔的一个或多个管道的序列。 ANDOR列表以左关联性执行。 AND列表的格式为

command1 && command2
     当且仅当 command1 返回退出状态为零时,才会执行

command2 。 OR列表的格式为

command1 || command2
     当且仅当 command1 返回非零退出状态时,才会执行

command2 。 AND和OR列表的返回状态是列表中执行的最后一个命令的退出状态。