Shell IO重定向顺序,管道版本

时间:2016-12-26 13:32:32

标签: bash shell io-redirection

我见过这个问题: Shell redirection i/o order

但我有另一个问题。如果此行无法将stderr重定向到file

ls -xy 2>&1 1>file

那么为什么这一行可以将stderr重定向到grep

ls -xy 2>&1 | grep ls

我想知道实际上是如何在下面运行的。

据说2>&1将stderr重定向到stdout的副本。 “stdout的副本”是什么意思?究竟是什么被复制了?

终端通过自身(通过操作系统)注册,通过其创建的流程的标准流进行发送和接收,对吧?其他重定向是否也通过操作系统(我不这么认为,因为终端可以自己处理)?

2 个答案:

答案 0 :(得分:3)

管道重定向(将一个命令的标准输出连接到下一个命令的stdin)在命令执行重定向之前发生。 这意味着,当2>&1发生时,ls的标准输出已经设置为连接到grep的标准输入。

请参阅man page of bash

  

管道

     

命令的标准输出通过管道连接到   command2的标准输入。之前执行此连接   命令指定的anyredirections(参见下面的REDIRECTION)。如果   除了它之外,还使用了&命令的标准错误   standardoutput,通过连接到command2的标准输入   管道;它是2>& 1 |的简写。这种隐式重定向   标准输出的标准错误在执行之后执行   该命令指定的anyredirections。

(强调我的)。

然而在前一种情况下(ls -xy 2>&1 1>file),没有发生类似情况,即当执行2>&1时,ls的标准输出仍然连接到终端(并且没有但已被重定向到文件)。

答案 1 :(得分:1)

  

这回答了我的第一个问题。其他人怎么样?

嗯,你的第二个问题已在评论中得到解答。 (重复的是文件描述符)。

关于你的上一个问题,

  

终端通过自身(通过操作系统)注册,通过其创建的流程的标准流进行发送和接收,对吧?其他重定向是否也通过操作系统(我不这么认为,因为终端可以自己处理)?

它是 shell ,它附加了它创建的进程的标准流(首先是管道,然后是刚刚学过的<>')。在默认情况下,它会将它们附加到自己的流中,这些流可能附加到 tty ,您可以通过多种方式进行交互,通常是终端仿真窗口或串行控制台,随你。 终端是一个非常模糊的词。