【问题标题】:Shell IO redirection order, pipe versionShell IO 重定向命令,管道版本
【发布时间】:2016-12-26 13:32:32
【问题描述】:

我看过这个问题: 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 的副本。 “标准输出的副本”是什么意思?实际复制的是什么?

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

【问题讨论】:

  • 标准输出的副本:它是重复的,因为它使用dup
  • dup??你的意思是堆栈操作?在哪个堆栈上?
  • dup 是一个系统调用:man 2 dupOr here.

标签: bash shell io-redirection


【解决方案1】:

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

man page of bash

管道

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

(强调我的)。

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

【讨论】:

  • 这回答了我的第一个问题。其他人呢?
【解决方案2】:

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

嗯,你的第二个问题已经在 cmets 中得到了回答。 (复制的是文件描述符)。

关于你的最后一个问题,

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

它是 shell,它附加了它创建的进程的标准流(首先是管道,然后是 的,正如您刚刚学到的那样)。在默认情况下,它会将它们附加到自己的流中,这些流可能附加到 tty,您可以通过多种方式与之交互,通常是终端仿真窗口或串行控制台,任何。 Terminal 是一个很模棱两可的词。

【讨论】:

  • 你的意思是2>&1 会做类似close(2); dup2(1, 2); 的事情?
  • 是的,功能上如此。一般情况下,close()不必在dup2()之前;我不知道 bash 源代码中使用的确切代码。
  • 谢谢。维基百科页面dup (system call) 帮助我理解了这一点。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
相关资源
最近更新 更多