在对
Piping a file through tail and head via tee的回复中,在使用大文件时,在以下构造中观察到了头部的奇怪行为:
#! /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
题:
为什么最后一行输出与前两行相同的行?
这是因为一旦传输三条第一行,磁头就会退出.随后,tee被SIGPIPE杀死,因为它正在写入的“FILE”管道的读取端被关闭,但是直到它设法将一些行输出到它的stdout.
如果你执行这个:
tee >(head -n3 >/dev/null) < /tmp/n
你会看到更好的事情.
OTOH,tac读取整个文件,因为它必须反转它,就像sed一样,可能是一致的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。