【问题标题】:In bash, how can I display the output of a command ONLY if there is an error?在 bash 中,如何仅在出现错误时显示命令的输出?
【发布时间】:2016-08-27 19:07:25
【问题描述】:

我有一个构建脚本,在某些时候我会调用make -j4。不过,我不想每次都看到它的全部输出。除非有错误。那么如果make返回非零结果,我该如何缓冲输出并打印呢?

【问题讨论】:

  • 如果有错误,会在stderr。就做make -j4 > /dev/null
  • 我试图实现的是在出错时显示整个输出,而不仅仅是 stderr 上的输出。

标签: linux bash terminal


【解决方案1】:

将输出保存到临时文件

tmp=$(mktemp)
make -j4 &> "$tmp"

只有在出现错误时才显示

if (( $? )) ; then
    cat "$tmp"
fi
rm "$tmp"

【讨论】:

  • 不创建外部文件也能实现同样的行为吗?
  • 您也可以将输出存储在变量中,output=$(make -j4 2>&1)。但它可能会变得很大。
【解决方案2】:

将输出保存在变量中 - 并在出错时打印

cmdout=$(make -j4 2>&1)
es=$?
if ((es)); then
  echo >&2 "make error es $es: \"$cmdout\""
else
  echo "make success"
fi

【讨论】:

  • if ((es)); then 部分是否正确?应该是$es
  • 在算术条件 ((...)) 中,您只能使用具有整数值的变量,并且美元符号“$”是可选的 - 与 [[ ... ]] 的另一个区别是不需要((...)) 内的前导和尾随空格
  • 不过也有一些例外,例如x=13; ((16#x == 19)) && 回声等于 || echo 不相等 -bash: ((: 16#x: value too great for base (error token is "16#x")
  • 顺便说一句,cmdout=$(make -j4 2>&1) 会从输出中删除颜色吗?
  • 颜色应该来自 xterm 颜色转义序列 - 我认为颜色是保留的 - cmdout=$(echo "tickle me pink"|grep --color=always pink); echo "cmdout \"$cmdout\"" - 适合我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多