为什么重定向+管道(2>& 1 |)合并两个流而不是将stderr移动到stdout?

时间:2011-06-25 18:28:49

标签: linux bash redirect io-redirection

我读到重定向是从左到右处理的。所以在这个例子中

 command 2>&1 | less

人们会认为fd 2首先被引导到fd 1然后fd 1被发送到管道。所以fd 1和2指向不同的地方。

但实际上这里fd 1和2都指向管道,因为由于某种原因fd 1首先被发送到管道然后fd 2被发送到fd 1.为什么在这种情况下从右到左处理重定向?

3 个答案:

答案 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.
# ...