我见过这个问题: 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的副本”是什么意思?究竟是什么被复制了?
终端通过自身(通过操作系统)注册,通过其创建的流程的标准流进行发送和接收,对吧?其他重定向是否也通过操作系统(我不这么认为,因为终端可以自己处理)?
答案 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 ,您可以通过多种方式进行交互,通常是终端仿真窗口或串行控制台,随你。 终端是一个非常模糊的词。