除非非零退出代码,否则禁止输出

dim*_*414 19 cron io-redirection shell-script

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

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

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

对于上下文,我希望将其添加到我的 cron 脚本中,以便在失败时通过电子邮件发送所有内容,但如果失败则不会。

Mic*_*zek 16

无论如何,您都必须在某处缓冲输出,因为您需要等待退出代码才能知道要做什么。像这样的事情可能是最简单的:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Run Code Online (Sandbox Code Playgroud)


Pet*_*aut 11

moreutils软件包包含chronic用于此目的的程序。你只是称之为

chronic my_program args ...
Run Code Online (Sandbox Code Playgroud)

在 cron 工作中非常方便。

  • 不要像我一样将 `chronic` 误认为 `cronic`,这是一个类似的程序,它会抑制输出,除非存在具有非零代码的命令*或产生标准错误输出*。 (4认同)