Ada*_*tav 3 linux bash command-line pipe
我试图更深入地了解管道和重定向。在每个指南中都说cmd1 | cmd2
cmd1 将执行,并且 stdout 将与 cmd2 的 stdin 共享。但这在我看来不太好,所以我测试了它:
所以看起来 ./test.sh和grep 都是并行运行的!
这是源代码:
#!/bin/bash
a=0
while :
do
((a=a+1))
echo "Line number $a"
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
尝试使用不同的推荐会显示相似的结果。 管道是否平行运行?
管道和重定向如何“在幕后”工作?
是的,所有命令同时运行。在您的情况下,grep
与 同时启动test.sh
,但由于它读取其标准输入,因此它会被阻止,直到test.sh
将某些内容放入其中为止,这不会立即发生。这两个进程相互配合,如果第二个进程很慢,第一个进程将填满它的标准输出输出缓冲区,并等待第二个进程读取一些内容。如果第一个很慢,则第二个在读取输入(如果没有可用的输入)时会被阻塞。
在现实生活中,第一个进程的标准输出是以相当大的块(大约 4K)(*) 写入的,因此第二个进程没有任何内容可读取,直到第一个进程写入至少 4K 的数据。您的test.sh
使用echo
可能有点不同,并进行行缓冲输出。
(*) 规则是,如果输出到“tty”(即终端),则它是行缓冲的:输出中的 LF 会导致实际输出发生。否则,它会按 4K 块进行缓冲。第一个进程还可以显式抑制所有缓冲,但这对性能不利。
归档时间: |
|
查看次数: |
4980 次 |
最近记录: |