行为不端的重定向

时间:2013-05-21 07:17:16

标签: bash pipe io-redirection tee

在回复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

问题:

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

1 个答案:

答案 0 :(得分:8)

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

如果您执行此操作:

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

你会看到更好的事情。

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