也许现在已经很晚了,我有脑屁但不应该这个
(>&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.
答案 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仍然连接到终端。
要将stdout
和stderr
重定向到/dev/null
,您必须使用
(>&2 echo dying) >/dev/null 2>&1