Bash 为什么';是否将此重定向到/dev/null?

Bash 为什么';是否将此重定向到/dev/null?,bash,pipe,stderr,Bash,Pipe,Stderr,也许已经很晚了,我的大脑在放屁,但这不应该吗 (>&2 echo dying) 2>&1 >/dev/null 在正常外壳中不产生输出 类似地,如果这是/tmp/x.pl #!/usr/bin/perl die "dying" 那为什么会这样呢 #> perl /tmp/x.pl 2>&1 >/dev/null 输出 dying at /tmp/x.pl line 2. ?执行文件描述符重定向的顺序非常重要 只需切换命令: (&

也许已经很晚了,我的大脑在放屁,但这不应该吗

(>&2 echo dying) 2>&1 >/dev/null
在正常外壳中不产生输出

类似地,如果这是
/tmp/x.pl

#!/usr/bin/perl
die "dying"
那为什么会这样呢

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

dying at /tmp/x.pl line 2.

?执行文件描述符重定向的顺序非常重要

只需切换命令:

(>&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
,它将从计算时开始(而不是之前)将STDOUT发送到
/dev/null

第二种情况也是如此


因此,在操作文件描述符时始终保持顺序,如果从左到右,则保持求值顺序。

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

要将
stdout
stderr
重定向到
/dev/null
,必须使用

(>&2 echo dying) >/dev/null 2>&1
顺便说一句,这也很普遍