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
顺便说一句,这也很普遍