为什么不将此重定向到/ dev / null?

时间:2016-10-06 22:21:33

标签: bash pipe stderr

也许现在已经很晚了,我有脑屁但不应该这个

(>&2 echo dying) 2>&1 >/dev/null

在普通shell中没有输出?

同样,如果这是/tmp/x.pl

#!/usr/bin/perl
die "dying"

那为什么呢

#> perl /tmp/x.pl 2>&1 >/dev/null

输出

dying at /tmp/x.pl line 2.

2 个答案:

答案 0 :(得分:1)

完成文件描述符重定向的顺序非常重要。

只需切换订单:

(>&2 echo dying) >/dev/null 2>&1
perl /tmp/x.pl >/dev/null 2>&1

当你在做的时候:

(>&2 echo dying) 2>&1 >/dev/null

子shell(())的STDOUT被重定向到子shell的STDERR首先。然后在父(主)shell中,您已将STDERR重定向到STDOUT,此时指向终端,因此子shell中的STDERR将被打印,然后您将STDOUT重定向到/dev/null,这将发送从评估时间开始到/dev/null,而不是之前。

类似的说明也适用于第二种情况。

因此,在操作文件描述符时始终保持顺序,以及从左到右的评估顺序。

答案 1 :(得分:1)

重定向从左到右处理。因此,在进行2>&1之前,您正在执行>/dev/null 。这将FD 2重定向到FD 1的原始连接(可能是终端),然后将FD 1重定向到/dev/null。 FD 2仍然连接到终端。

要将stdoutstderr重定向到/dev/null,您必须使用

(>&2 echo dying) >/dev/null 2>&1