我不了解数据在管道中的流动方式,希望有人可以澄清其中的情况。
我认为命令管道以逐行方式处理文件(文本,字符串数组)。(如果每个命令本身一行一行地工作。)文本的每一行都通过管道,命令不必等待前一个命令完成对整个输入的处理。
但似乎并非如此。
这是一个测试示例。有几行文字。我将它们大写,并重复每行两次。我这样做cat text | tr '[:lower:]' '[:upper:]' | sed 'p'
。
要遵循此过程,我们可以“交互式”运行它-跳过中的输入文件名cat
。管道的每一部分都逐行运行:
$ cat | tr '[:lower:]' '[:upper:]'
alkjsd
ALKJSD
sdkj
SDKJ
$ cat | sed 'p'
line1
line1
line1
line 2
line 2
line 2
但是完整的管道确实在等我完成输入,EOF
然后才打印结果:
$ cat | tr '[:lower:]' '[:upper:]' | sed 'p'
I am writing...
keep writing...
now ctrl-D
I AM WRITING...
I AM WRITING...
KEEP WRITING...
KEEP WRITING...
NOW CTRL-D
NOW CTRL-D
应该是这样吗?为什么不逐行显示?
tr
并且sed
从cat
stdin关闭之前开始执行生产线
cat
缓冲直到stdin关闭。