Answers:
php /path/to/script.php > logfile || cat logfile; rm logfile
它将标准输出转储到logfile
脚本中,并且仅在脚本失败(退出非零)时才输出。
注意:如果脚本也可能输出到stderr
,则应重定向stderr
到stdout
。否则,stderr
即使退出代码为0,打印到的任何内容也会导致cron发送电子邮件:
php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
您是否考虑过moreutils的慢性病。我认为它完全符合您的要求:
慢性运行命令,并安排其标准输出和标准错误仅在命令失败(退出非零或崩溃)时显示。如果命令成功执行,则任何多余的输出都将被隐藏。
在最近的版本中,-e
如果已将任何内容写入stderr ,则会有一个开关来显示完整的输出。
由于输出是在知道退出状态之前生成的,因此您必须将其存储在某个位置。
一种可能性是将其存储在shell变量中:
output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
printf "%s\n" "$output"
fi
这不会完全保留脚本的输出(它会删除尾随的空白行),但是在此用例中是可以的。如果要保留尾随的空白行:
output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
printf "%s" "${output%a}"
fi
如果可能有很多输出,则您可能更喜欢将其存储在临时文件中:
output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
echo "script.php failed (status $ret), see the output in $output_file"
fi