-1

我有一个调用一堆命令的脚本,其中一些对标准输出有噪音,一些对标准错误,一些对两者都有。我打算让脚本由 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 运行时,它会给出权限被拒绝消息。我不清楚为什么。

4

3 回答 3

2

代替

exec 2>&3

exec 3>&-
于 2010-03-09T17:13:32.910 回答
0

为什么不直接将 cronjob 中的标准输出重定向到 /dev/null?不要使用 be_quiet 函数,将 die 更改为:

die() {
    echo "$*" >&2
}

然后,在您的 cronjob 中:

* * * * * /path/to/script.sh >/dev/null

当您的脚本使用 die 函数输出某些内容时,您应该只从 cron 获取邮件。

于 2010-03-11T00:22:11.017 回答
0

许多年后,我遇到了解决第一句话中描述的实际问题的完美工具:chronic,它:

运行命令,并安排其标准输出和标准错误仅在命令失败(退出非零或崩溃)时显示。如果命令成功,任何无关的输出都将被隐藏。

这就是我想要的!

于 2020-01-19T22:00:51.613 回答