为什么指令用stdout向后交换stderr?

时间:2013-12-19 22:00:36

标签: stdout swap stderr io-redirection

在地理位置,我发现有人建议你可以用stdout交换stderr,如下所示:

命令3>& 2 2>& 1 1>& 3

这看起来倒退了。如果我们发送3到2,然后立即发送2比1(现在看起来似乎发送3和2到1)。我认为有一些基本的我不了解IO重定向,但我找不到任何澄清它的东西。

2 个答案:

答案 0 :(得分:2)

您可以在http://www.catonmat.net/blog/bash-one-liners-explained-part-three/第21节找到详细说明:

  

$ command 3>& 1 1>& 2 2>& 3这里我们首先将文件描述符3复制到   是stdout的副本。然后我们将stdout复制为stderr的副本,   最后我们将stderr复制为文件描述符3的副本,   这是stdout。结果我们交换了stdout和stderr。

在给出的链接上有更多细节和图片。关键见解是:

3>&1表示“指向1指向的3点”。然后1>&2说“现在1指向2指向的地方”(1现指向流2,但3指不跟......),最后2>&3说“现在2指向哪里3指向(这是流1)。

以图形方式(但请参阅链接 - 它比我的ascii-art好得多):

0 --> /dev/tty0
1 --> /dev/tty1
2 --> /dev/tty2

3>&1之后:

0 --> /dev/tty0
1 --> /dev/tty1
2 --> /dev/tty2
3 --> /dev/tty1

1>&2之后:

0 --> /dev/tty0
1 --> /dev/tty2
2 --> /dev/tty2
3 --> /dev/tty1

2>&3之后:

0 --> /dev/tty0
1 --> /dev/tty2
2 --> /dev/tty1
3 --> /dev/tty1

如您所见,12已被换掉。相同的链接建议使用3

关闭临时流3>&-

答案 1 :(得分:1)

嗯,我从来没有见过......反正......似乎基本上是先说...将3发送到2的地址....然后将2发送到地址1 .. ..然后发送一个到3的地址...从第一步开始,我们知道两个的原始地址...所以你已经交换了它们......虽然我没有测试过自己... ..