管道输出通过bash或双管,||表达?

时间:2014-09-10 16:26:47

标签: bash pipe

我有一个嘈杂的命令,我想在成功时隐藏其输出。但是,在失败的情况下,该输出可能对调试有帮助,所以我想在打印错误消息之前显示它。

目前,我这样做:

OUTPUT=$( cmd1 2>&1 ) || {
  echo $OUTPUT
  echo cmd1 failed
  exit 1
}

是否可以通过cmd1(或双管道)输出||的输出,以便我可以避免为输出创建变量?

3 个答案:

答案 0 :(得分:1)

您需要保存命令某处的输出,因为在命令完成是否将输出发送到控制台之前您都不知道。将输出管道输送到某些东西不会有帮助,因为管道没有大的缓冲区。

您有一些缓冲选项,但如果您不期望兆字节的输出,那么使用变量是合理的,这远远超出noisy的定义。您也可以使用临时文件,但除非您打算在内存非常有限的系统上部署(按照今天的标准),否则几乎没有什么优势。

答案 1 :(得分:1)

试试:

OUT=$(command....) && OUT= || { echo $OUT; exit 1;}
  • 当命令结果为&&(退出0)时执行的OK
  • 并清除OUT

答案 2 :(得分:1)

Joey Hess'moreutils有一个命令chronic(1),它可以完全按照您的要求运行:它运行命令,吃stdoutstderr除非< / em>该命令退出非零,在这种情况下输出将通过。