在地理位置,我发现有人建议你可以用stdout交换stderr,如下所示:
命令3>& 2 2>& 1 1>& 3
这看起来倒退了。如果我们发送3到2,然后立即发送2比1(现在看起来似乎发送3和2到1)。我认为有一些基本的我不了解IO重定向,但我找不到任何澄清它的东西。
答案 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
如您所见,1
和2
已被换掉。相同的链接建议使用3
3>&-
答案 1 :(得分:1)