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
可以很好地处理换行符(unlineecho
)。使用(echo OK;true)
只是一个例子——实际上它是一个可执行文件——所以我不能只捕获第一部分。但是修复它是很容易的var=$(echo OK;true)和&printf“%s\n”“$var”
也能起到同样的作用在shell变量中保存未知数量的数据对我来说似乎很难,但它能起作用,printf
能很好地处理换行符(unlineecho
)。使用(echo OK;true)
只是一个例子——实际上它是一个可执行文件——所以我不能只捕获第一部分。但是修复它很容易var=$(echo OK;true)&&printf“%s\n”“$var”
的工作原理相同