*NIX中的命令管道是如何工作的?

5
当我执行这个操作时:
find . -name "pattern" | grep "another-pattern"

进程 findgrep 是否一起启动?我猜是的。如果是这样,那么它是如何工作的呢?

yes | command_that_prompts_for_confirmations

如果 yes 持续向标准输出发送 'y',而 command_that_prompts_for_confirmations 在读取其标准输入时每次都会读取 'y',那么 yes 如何知道何时终止?因为如果我仅运行 yes 而不将其输出导入其他命令,则它永远不会结束。
但是,如果管道命令不会同时生成所有进程,那么 yes 如何知道要输出多少个 'y'?对我来说,这是个死结。有人能解释一下在 *NIX 中如何工作的吗?

为什么人们使用“*nix”而不是直接输入“unix”?你害怕商标诉讼吗? - Graeme Perrow
http://en.wikipedia.org/wiki/Unix-like - dotjoe
感谢大家的回答! - Srikanth
4个回答

11

维基百科页面得知:"单独使用yes命令会输出'y'或指定的参数,跟随一个换行符,直到用户停止或被其他方式终止;当通过管道送入命令时,它将持续输出,直到管道断开(即程序完成执行)。”

yes不知道何时终止。然而,在某个点上,向标准输出输出“y”将导致错误,因为其他进程已经结束,这将导致管道中断,yes将终止。

下面是执行顺序:

  1. 其他程序终止
  2. 操作系统关闭管道
  3. yes尝试输出字符
  4. 发生错误(管道中断)
  5. yes终止

5
是的,通常来说,管道中的所有进程都是一起启动的。对于yes等情况,会向上传递一个信号以指示它不再接受输入。具体而言:SIGPIPE,详情请参见这里这里。有关*nix管道的更多有趣信息,请参见维基百科

如果您打断了一个不希望被打断的命令,您就可以看到SIGPIPE的效果,因为您会收到一个Broken Pipe错误。但我似乎找不到一个在我的Ubuntu设置中可以做到这一点的例子。


4

其他答案已经涵盖了终止的内容。另一个方面是,是的命令只会输出有限数量的y - 管道中有一个缓冲区,一旦缓冲区被填满,yes命令将在其写请求中阻塞。因此,yes命令不会消耗无限的CPU时间。


3

第一个进程的标准输出(stdout)与第二个进程的标准输入(stdin)相连,以此类推。当第二个进程完成时,“yes”退出,因为它再也没有stdout可写入了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接