stderr 只能在屏幕上打印,不能通过管道传输

stderr can only be printed on screen but cannot be piped

我刚刚遇到了关于 stdout 和 stderr 的一些奇怪的事情!

这非常有效:

$ ( { { echo "This is stdout"; echo "This is stderr" 1>&2; } | sed "s/^/stdout captured - /"; } 3>&2 2>&1 1>&3 ) | sed "s/^/stderr captured - /"
stderr captured - This is stderr
stdout captured - This is stdout

然而,看到这个:

$ sudo postfix status >/dev/null
postfix/postfix-script: the Postfix mail system is not running
$ sudo postfix status 2>/dev/null
$

我认为,屏幕上的消息肯定是 STDERR,但是:

$ ( { { sudo postfix status; } | sed "s/^/stdout captured - /"; } 3>&2 2>&1 1>&3 ) | sed "s/^/stderr captured - /"
$

未捕获任何内容。我只是简单地发出下面的命令,然后什么也得不到:

$ `sudo postfix status 2>/tmp/somelog` && cat /tmp/somelog
$

这似乎超出了我对 bash

的了解

ps:我在 MAC OSX 10.11.6,终端。

我认为这与 postfix 命令作为管道的一部分时实际表现不同有关。

我在我的系统上试过了:

sudo postfix status 2>log

log 结果是空的。与 :

相同
postfix status 2>log

似乎 postfix 在其输出不进入终端时抑制此输出。