Bash 行为不端的头部重定向

Bash 行为不端的头部重定向,bash,pipe,io-redirection,tee,Bash,Pipe,Io Redirection,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 )

在对的答复中,在处理大型文件时,在以下结构中观察到
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!?
问题:
为什么最后一行不输出与前两行相同的行?

这是因为
head
在传输前三行时立即退出。随后,
tee
将被SIGPIPE终止,因为它正在写入的“文件”管道的读取端已关闭,但直到它成功地将一些行输出到其标准输出

如果仅执行以下操作:

tee >(head -n3 >/dev/null) < /tmp/n
tee>(head-n3>/dev/null)
你会更好地看到发生了什么


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

谢谢。我现在明白了。我甚至可以像这样添加
cat
(tee>(head-n3>&3;cat>/dev/null)&1
,以使其工作。欢迎:)不过,我想说,对该部分使用
sed
会更清晰。请注意,对于小于5行的文件,至少其中一些会得到两次输出。
tee >(head -n3 >/dev/null) < /tmp/n