【问题标题】:Why doesn't this redirect to /dev/null?为什么不重定向到 /dev/null?
【发布时间】:2016-10-06 22:21:32
【问题描述】:

也许只是太晚了,我在放屁,但不应该这样

(>&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.

?

【问题讨论】:

标签: bash pipe stderr


【解决方案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

【讨论】:

    【解决方案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 从评估时开始,而不是之前。

    第二种情况也有类似的说明。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2017-11-29
      相关资源
      最近更新 更多