Bash 成功时禁止输出的管道命令

Bash 成功时禁止输出的管道命令,bash,shell,unix,Bash,Shell,Unix,我运行的命令总是打印一些输出。我只想在命令失败时看到输出 大概是这样的: %(回声正常;正确)|过滤器 %(回波错误;错误)|滤波器 错误 能否使用标准shell工具实现过滤器? 结构不一定是管道。类似于过滤器“my_command”的东西是可以的 另外,实际的程序是一个单元测试,使用Google测试套件实现。它总是非常冗长,如果成功,输出就不有趣了 在本例中,您不需要子shell,如下所示,命令集的退出代码(由“;”分隔的命令列表)是该集中最后一个命令的退出代码。因此,在您的示例中,只有最

我运行的命令总是打印一些输出。我只想在命令失败时看到输出

大概是这样的:

%(回声正常;正确)|过滤器
%(回波错误;错误)|滤波器
错误

能否使用标准shell工具实现
过滤器
? 结构不一定是管道。类似于
过滤器“my_command”
的东西是可以的

另外,实际的程序是一个单元测试,使用Google测试套件实现。它总是非常冗长,如果成功,输出就不有趣了

在本例中,您不需要子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
页面对
命令列表的说明

AND和OR列表是分别由
&&
|
控制运算符分隔的一个或多个管道的序列<代码>和以及
列表以左关联性执行。AND列表具有以下格式:

command1 && command2
command1 || command2
当且仅当command1返回零的退出状态时,才会执行command2。或列表具有以下形式:

command1 && command2
command1 || command2
当且仅当command1返回非零退出状态时,才会执行command2。AND和OR lists的返回状态是在列表中执行的最后一个命令的退出状态

在本例中,您不需要子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
页面对
命令列表的说明

AND和OR列表是分别由
&&
|
控制运算符分隔的一个或多个管道的序列<代码>和以及
列表以左关联性执行。AND列表具有以下格式:

command1 && command2
command1 || command2
当且仅当command1返回零的退出状态时,才会执行command2。或列表具有以下形式:

command1 && command2
command1 || command2
当且仅当command1返回非零退出状态时,才会执行command2。AND和OR lists的返回状态是在列表中执行的最后一个命令的退出状态


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

command 1>/dev/null

这样,只会显示错误消息。

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

command 1>/dev/null

这样,只会显示错误消息。

是否始终存在子shell
()
或者只是这里显示的一个示例?
a=$(echo OK;true)| echo“$a”
<代码>a=$(回显错误;错误)|回显“$a”@伊尼安,不是-子shell只是试图写一个清晰的例子。@anishsane,除非输出中有换行符,否则效果很好。伊尼安的回答也涉及到了这些问题。@ugoren,你是否错过了
echo“$a”
中的引号?因为使用引号,即使是多行输出,它也应该可以正常工作。。。e、 g.
a=$(echo hi;echo;echo hello;false)| | echo“$a”
是否始终存在子shell
()
或者只是这里显示的一个示例?
a=$(echo OK;true)| echo“$a”
<代码>a=$(回显错误;错误)|回显“$a”@伊尼安,不是-子shell只是试图写一个清晰的例子。@anishsane,除非输出中有换行符,否则效果很好。伊尼安的回答也涉及到了这些问题。@ugoren,你是否错过了
echo“$a”
中的引号?因为使用引号,即使是多行输出,它也应该可以正常工作。。。e、 g.
a=$(echo hi;echo;echo hello;false)| | echo“$a”
这不是我要问的。我想在成功时抑制所有输出,在错误时显示所有输出。这不是我想要的。我想在成功时抑制所有输出,在出错时显示所有输出。在shell变量中保存未知数量的数据对我来说似乎很难,但它可以工作,
printf
可以很好地处理换行符(unline
echo
)。使用
(echo OK;true)
只是一个例子——实际上它是一个可执行文件——所以我不能只捕获第一部分。但是修复它是很容易的
var=$(echo OK;true)和&printf“%s\n”“$var”
也能起到同样的作用在shell变量中保存未知数量的数据对我来说似乎很难,但它能起作用,
printf
能很好地处理换行符(unline
echo
)。使用
(echo OK;true)
只是一个例子——实际上它是一个可执行文件——所以我不能只捕获第一部分。但是修复它很容易
var=$(echo OK;true)&&printf“%s\n”“$var”
的工作原理相同