禁止输出,除非退出代码为非零


19

除非程序以非零代码退出,否则抑制输出(stdout和stderr)的最佳方法是什么?我在想:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}

并运行,quiet_success my_long_noisy_script.sh但我不确定是否有更好的方法。我觉得这必须是其他人需要做的事情。

就上下文而言,我希望将其添加到我的cron脚本中,以便如果它们失败了,我会收到一封包含所有内容的电子邮件,如果没有,则不会。


这应该是大多数命令的默认行为(成功时不输出)。如果没有,那么要做的第一件事就是寻找一个选项/开关来启用这种行为。如果不这样做,您的方法就是正确的想法。旁注:我假设您发布的是伪代码,因为它实际上不是有效的sh语法,并且您的重定向顺序是反向的(请> "$file" 2>&1使用更多引号)。
2012年

是的,我只是在问题中输入了它。应用您的建议,我同意,命令应该对此负责,但是but ...
dimo414 '22

只是语法上的注意事项:不需要在命令前后加上括号。
manatwork 2012年

Answers:


14

无论如何,您都将不得不在任何地方缓冲输出,因为您需要等待退出代码知道该怎么做。这样的事情可能是最简单的:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output

请注意,如果您set -o xtrace在shell脚本中使用,那么所有输出将再次记录在日志中,作为记录分配细节的一部分output=...:-)。在这种情况下,最好使用chronic
Jan-Philip Gehrcke

11

moreutils软件包包含chronic用于此目的的程序。你只是这样称呼

chronic my_program args ...

在Cron工作中非常方便。


3
别喜欢我和错误chronic的人cronic,这是一个类似的程序,它会抑制输出,除非存在带有非零代码的命令或产生标准错误输出
Witiko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.