我读到重定向是从左到右处理的。所以在这个例子中
command 2>&1 | less
人们会认为fd 2首先被引导到fd 1然后fd 1被发送到管道。所以fd 1和2指向不同的地方。
但实际上这里fd 1和2都指向管道,因为由于某种原因fd 1首先被发送到管道然后fd 2被发送到fd 1.为什么在这种情况下从右到左处理重定向?
答案 0 :(得分:3)
管道不是重定向,因此实际上重定向(在您的示例中只有一个)正在以您的思维方式进行处理。管道最后是一个单独的东西。
答案 1 :(得分:3)
原因是管道与重定向不同。重定向会影响one命令,而管道会连接两个命令。
答案 2 :(得分:3)
fd 2指向fd 1指向的位置(即stdout)。在
command 2>&1 | less
在重定向生效之前,stdout已经指向管道了!
有关更详细的说明,请参阅:
http://www.linuxtutorialblog.com/post/tutorial-the-best-tips-tricks-for-bash
# ...
# Well, here's a thing you should remember: bash reads command statements from
# the left to the right, but, before that, determines if there are multiple command
# statements and in which way they are separated. Therefore, bash already read
# and applied the "|" pipe symbol and stdout is already pointing to the pipe.
# ...