我有一个脚本可以调出一堆命令,其中一些命令对stdout很吵,有些对stderr有些,有些对两者都有。我打算让脚本由cron运行,所以我不希望它吵闹并且每天都给我发邮件 - 只是在错误的情况下。所以我这样做:
be_quiet() {
# save stderr in FD 3
exec 3>&2
exec &> /dev/null
}
die() {
# restore stderr
exec 2>&3
echo $* > /dev/stderr
exit 1
}
然后,即
be_quiet
mkdir -p $CLIENT_ROOT || die "Could not create client root."
cd $CLIENT_ROOT || die "Could not cd to client root."
意图是如果出现错误,我会收到特定且有意义的消息,否则没有。但我现在看到的只是
line 48: /dev/stderr: Permission denied
从命令行运行时,这有效。当通过cron运行时,它会给出权限被拒绝的消息。我不明白为什么。
答案 0 :(得分:2)
而不是
exec 2>&3
DO
exec 3>&-
答案 1 :(得分:0)
为什么不将cronjob中的stdout重定向到/ dev / null?不要使用be_quiet函数,并将die更改为:
die() {
echo "$*" >&2
}
然后,在你的cronjob中:
* * * * * /path/to/script.sh >/dev/null
当您的脚本使用die函数输出内容时,您应该只从cron获取邮件。
答案 2 :(得分:0)
很多年后,我遇到了一个完美的工具,可以解决第一句话chronic中描述的实际问题,
运行命令,并安排其标准输出和标准错误仅在命令失败(非零退出或崩溃)时显示。如果命令成功执行,则任何多余的输出都将被隐藏。
这就是我想要的!