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