2017-02-16 134 views
1

我正在运行一个命令,总是打印一些输出。我只想在命令失败的情况下看到输出。管道命令抑制成功输出

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

可以FILTER使用标准的shell工具来实现? 结构不一定是管道。像FILTER "my_command"就好。

P.S.实际的程序是一个单元测试,使用Google测试套件实施。它总是非常冗长,并且在成功的情况下,输出不是很有趣。

+0

总会有一个子外壳存在吗? '()'或者这里显示的一个例子? – Inian

+0

'a = $(echo OK; true)||回声“$ a”'; 'a = $(echo ERROR; false)||回声“$ a”'; – anishsane

+0

@Inian,不 - 子壳只是一个尝试写一个明确的例子。 – ugoren

回答

2

DONT需要在你的情况下,一个子shell,因为你可以看到下面的命令集的退出代码(由分开的命令列表“;”),是最后一个退出代码在集合中的命令。所以最后只有truefalse在你的例子中很重要。事情之前没有任何命令。

要做到这一点是使用命令替换($())的最佳方式,捕获输出给一个变量,并使用内置||运营商的壳,在运行后续命令只有在返回代码以前的命令是失败的。

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序列,当且仅当命令1返回零退出状态

command1 && command2 

命令2执行表格。一个OR序列的形式

command1 || command2 

命令2执行,当且仅当命令1返回一个非零退出状态。 AND和OR列表的返回状态是在列表中执行的最后一个命令的退出状态。

+1

在shell变量中保存一个未知数量的数据对我来说似乎很尴尬,但它可以工作,并且'printf'可以很好地处理换行符(unline'echo')。 – ugoren

+0

'(echo OK; true)'的使用仅仅是一个例子 - 实际上它是一个可执行文件 - 所以我不能只捕获第一部分。但修复它很简单'var = $(echo OK; true)&& printf“%s \ n”“$ var”'工作方式相同 – ugoren

3

你可以重定向标准输出到/ dev/null与此:

command 1>/dev/null 

这样一来,仅显示错误消息。

+0

这不是我要求的。我想在成功时取消所有输出,显示所有错误输出。 – ugoren