命令pipe道在* NIX中如何工作?

当我这样做:

find . -name "pattern" | grep "another-pattern" 

这些进程是否被findgrep一起产生? 我的猜测是肯定的。 如果是这样,那么这是如何工作的?

 yes | command_that_prompts_for_confirmations 

如果yes则不断发送“y”给标准输出, command_that_prompts_for_confirmations读取标准input时读取“y”,如何知道何时结束? 因为如果我独自运行yes而不将其输出到其他命令,它永远不会结束。

但是如果pipe道命令不能同时产生所有的进程,那么如何知道有多less输出? 对我来说这就是22。 有人能解释一下这个pipe道在* NIX中的工作原理吗?

在维基百科页面上 : “本身,yes命令输出'y'或任何被指定为参数的参数,后跟一个换行符,直到用户停止或以其他方式被终止;当输入一个命令时,它将一直持续到管道休息(即程序完成执行)“。

yes ,不知道何时终止。 然而,在输出“y”到标准输出的某个点上,会导致错误,因为另一个进程已经完成,这将导致一个破损的管道,并且会终止。

顺序是:

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

是的,(一般来说)管道中的所有进程都是一起产生的。 yes和类似的情况而言,一个信号传回管道,表明它不再接受输入。 具体来说: SIGPIPE ,细节在这里和这里 。 关于* nix流水线的更多有趣的信息可以在wikipedia上找到 。

如果您中断了一个不期望的命令,您可以看到SIGPIPE正在运行,因为出现Broken Pipe错误。 我似乎无法找到一个例子,虽然我的Ubuntu的设置,虽然我的头顶。

其他答案已经涵盖终止。 另一个方面是,是只输出有限数量的y – 管道中有一个缓冲区,一旦满了,是会阻止其写入请求。 因此,是不消耗无限的CPU时间。

第一个进程的stdout连接到第二个进程的stdin,依此类推。 当第二个进程完成时,“yes”退出,因为它不再有写入的stdout。