作者:鱼和鱼还有鱼3_Mh_qet | 来源:互联网 | 2023-05-18 11:43
考虑一下这个Bash代码:
(cmd1 & cmd2) | consumer
consumer
标准输入可能会出现什么样的情况?
输出cmd1
,然后输出cmd2
?
来自cmd1
任意点缀的线条来自cmd2
?
来自cmd1
任意散布的字节来自cmd2
?
别的什么?
rici..
5
您可以期望看到随机交错的数据,但如果线条较短,则很可能在大多数情况下您会看到整行交错.
由于进程已stdout
重定向到管道(不是交互式设备),因此输出可能是完全缓冲的.由于缓冲区在满时写入,可能与行的末尾不对应,您可能会看到交错缓冲区,每个缓冲区末尾都有混合行.
Posix系统接口,2.5标准IO流:
打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.
但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效应.
这是一个快速测试:
$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117
该awk
程序将打印其没有在组合输出中出现两次,这将包括所有混行的任何行.所以在那种情况下,大约一千行中的一行被混合在一起.
顺便说一下,(cmd1 & cmd2)
只有cmd1
在后台运行.尽管如此,它们仍然是相互异步的.
1> rici..:
您可以期望看到随机交错的数据,但如果线条较短,则很可能在大多数情况下您会看到整行交错.
由于进程已stdout
重定向到管道(不是交互式设备),因此输出可能是完全缓冲的.由于缓冲区在满时写入,可能与行的末尾不对应,您可能会看到交错缓冲区,每个缓冲区末尾都有混合行.
Posix系统接口,2.5标准IO流:
打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.
但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效应.
这是一个快速测试:
$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117
该awk
程序将打印其没有在组合输出中出现两次,这将包括所有混行的任何行.所以在那种情况下,大约一千行中的一行被混合在一起.
顺便说一下,(cmd1 & cmd2)
只有cmd1
在后台运行.尽管如此,它们仍然是相互异步的.