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'?这对我来说是第 22 条规则。有人可以解释一下这个管道在 *NIX 中是如何工作的吗?

4

4 回答 4

11

维基百科页面“yes 命令本身输出'y'或任何指定为参数的内容,后跟换行符,直到被用户停止或以其他方式杀死;当管道输入命令时,它将继续直到管道中断(即程序完成执行)。”

yes不“知道”何时终止。但是,在某些时候将“y”输出到 stdout 会导致错误,因为其他进程已完成,这将导致管道损坏,并且 yes 将终止。

顺序是:

  1. 其他程序终止
  2. 操作系统关闭管道
  3. yes 尝试输出字符
  4. 发生错误(断管)
  5. 是的终止
于 2009-02-19T13:52:09.580 回答
5

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

SIGPIPE如果您中断了一个意外的命令,您可以看到它正在运行,因为您收到Broken Pipe错误。不过,我似乎无法在我的 Ubuntu 设置中找到一个例子。

于 2009-02-19T13:51:09.143 回答
4

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

于 2009-02-19T14:44:48.283 回答
3

第一个进程的标准输出连接到第二个进程的标准输入,依此类推。“是”在第二个过程完成时退出,因为它不再有要写入的标准输出。

于 2009-02-19T13:52:18.737 回答