stderr只能在屏幕上打印但不能用管道传输

时间:2017-03-30 08:59:51

标签: bash stdout stderr postfix

我刚刚遇到一些关于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,终端。

1 个答案:

答案 0 :(得分:1)

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

我在我的系统上试过这个:

sudo postfix status 2>log

并且log变空了。同样的事情:

postfix status 2>log

当输出没有到达终端时,似乎postfix会抑制此输出。