在对 Piping a file through tail and head via tee 的回复中,在处理大文件时,在以下构造中观察到 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
问题:
为什么最后一行输出的行和前两行不一样?
最佳答案
这是因为 head
刚传输完前三行就退出了。随后,tee
被 SIGPIPE 杀死,因为它正在写入的“FILE”管道的读取端已关闭,但直到它设法将一些行输出到其标准输出。
如果你只执行这个:
tee >(head -n3 >/dev/null) < /tmp/n
你会看到更好的结果。
OTOH,tac
读取整个文件,因为它必须反转它,sed
也是如此,可能是为了保持一致。
关于bash - 带有重定向的行为不端的头部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16664257/