考虑这个Bash代码:
(cmd1 & cmd2) | consumer
consumer
可能会在标准输入上看到哪些可能的东西?
cmd1
输出,然后从cmd2
输出?cmd1
的行与任意来自cmd2
?cmd1
的cmd2
?答案 0 :(得分:5)
您可以期待看到随机交错的数据,但如果线条较短,则很可能在大多数情况下您会看到整行交错。
由于进程将stdout
重定向到管道(不是交互式设备),因此输出可能是完全缓冲的。由于缓冲区在满时写入,很可能与行的末尾不对应,您可能会看到交错缓冲区,每个缓冲区末尾都有混合行。
Posix System Interfaces, 2.5 Standard IO Streams:
打开时,标准错误流未完全缓冲;当且仅当可以确定流不参考交互设备时,标准输入和标准输出流是完全缓冲的。
但是,无法保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效应。
这是一个快速测试:
$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117
awk
程序打印在组合输出中没有出现两次的任何行,其中包括所有混合行。因此,在这种情况下,大约一千行中的一行被混合在一起。
顺便说一句,在(cmd1 & cmd2)
中,只有cmd1
正在后台运行。尽管如此,它们仍然是相互异步的。