答案1
是的,所有命令都同时运行。在您的情况下,grep
与同时启动test.sh
,但由于它读取其标准输入,因此它会被阻塞,直到test.sh
将某些内容放入其中,而这不会立即发生。这两个进程相互协调,如果第二个进程很慢,则第一个进程将填满其标准输出缓冲区,并等待第二个进程读取一些内容。如果第一个进程很慢,则第二个进程在读取输入(如果没有可用输入)时会被阻塞。
在实际生活中,第一个进程的标准输出是以相当大的块(大约 4K)写入的(*),因此在第一个进程写入至少 4K 的数据之前,第二个进程没有任何内容可读取。您的test.sh
使用echo
可能略有不同,并进行行缓冲输出。
(*) 规则是,如果输出到“tty”(即终端),则它是行缓冲的:输出中的 LF 会导致实际输出发生。否则,它会被 4K 块缓冲。第一个进程也可以明确抑制所有缓冲,但这对性能不利。
答案2
您真正看到的是所谓的flow control
,和/或(重新)定向 - 再次;flow control
,或stdin
,stdout
(标准输入/标准输出)。
我希望我上述的陈述能帮助你更好地理解故意的发生什么,以及你可以做些什么来改善预计。
管道或“管道” stdout
,仅仅指示 stdout
在多数情况下。
平行是真的另一个名字隨機。 你可以试图同时运行 2 个不同/相同的命令/输出。但预期同步运行是不明智的,因为它不太可能发生。
对于你的例子;在这里你介绍了所谓的有条件的。与路标或交通信号灯非常相似。这些有条件的(編號)直接的 流动基于状况。在您的示例中,尽管“健康)状况” - 尽管 这, 做那. 一般条件重定向 stdin
,stdout
。
直接回答你的两个直接问题
- 管道是否平行
不,不一定。至少在普通的“平行” (串联) 的感觉。
但 pipe
能火 (发起) 2工作同时。甚至相同的工作两次。
- 管道和重定向如何在“幕后”发挥作用?
我希望上面我已经为你更好地说明了这一点。:)
或者
cat ./ASCII | grep somename >./output
以上cat ./ASCII
是输出(stdout
)。从而变成输入(stdin
)通过管道(|
)为grep somename
。即(重新)定向(>
)到其最终输出./output
。