8

在对通过 tee 通过 tail 和 head 通过管道传输文件的回复中,head在处理大文件时,在以下构造中观察到了一个奇怪的行为:

#! /bin/bash
for i in {1..1000000} ; do echo $i ; done > /tmp/n

( tee >(sed -n '1,3p'        >&3 ) < /tmp/n | tail -n2 ) 3>&1 # Correct
echo '#'
( tee >(tac | tail -n3 | tac >&3 ) < /tmp/n | tail -n2 ) 3>&1 # Correct
echo '#'
( tee >(head -n3             >&3 ) < /tmp/n | tail -n2 ) 3>&1 # Not correct!?

输出:

1
2
3
999999
1000000
#
1
2
3
999999
1000000
#
1
2
3
15504
15

问题:

为什么最后一行输出的行与前两行不同?

4

1 回答 1

8

这是因为head它在传输三个第一行时立即退出。随后,tee被 SIGPIPE 杀死,因为它正在写入的“FILE”管道的读取端已关闭,但直到它设法将一些行输出到其标准输出时才关闭。

如果你只执行这个:

tee >(head -n3 >/dev/null) < /tmp/n

你会看到更好的结果。

OTOH,tac读取整个文件,因为它必须反转它sed,可能是一致的。

于 2013-05-21T08:49:42.323 回答