所以我在Ubuntu 16.04机器上安装了这个cronjob
if ... echo "warning" | wall 2>&1 > /dev/null fi
我用来警告所有用户发生一些行动。 虽然我把它的输出redirect到/dev/null ,脚本以某种方式pipe理输出
wall: cannot get tty name: Inappropriate ioctl for device
通过电子邮件发送到根帐户。 我如何让wall沉默? 广播工作,但我不想在我的根邮箱有这些电子邮件。
# wall -V wall from util-linux 2.27.1
看着墙上的来源说:
259 if (print_banner == TRUE) { ... ... 271 where = ttyname(STDOUT_FILENO);
这个ttyname调用是你的问题的原因,因为cron不运行TTY。 这是因为tty名称是在标题消息IE中
Broadcast message from user@host (pts/0)
基于逻辑,但它不会尝试这个,如果你不告诉它打印横幅。 它通过调用这样的wall来避免这个问题是微不足道的:
if ... echo "warning" | wall -n 2>&1 > /dev/null fi
这应该完全避免这个问题。 您需要在结果输出中提供自己的横幅。
这是不符合你的期望的原因是因为你有两个redirect指定错误的顺序。 订单很重要。 你写了:
wall 2>&1 > /dev/null
这意味着“将stderrredirect到stdout当前正在进行的地方(通常是一个tty),然后将stdoutredirect到/ dev / null”。 你应该写下:
wall > /dev/null 2>&1
这意味着“将stdoutredirect到/ dev / null,然后将stderrredirect到stdout当前正在进行的位置(现在是/ dev / null)”。