cho*_*oba 8 bash pipe tee 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 ) < /tmp/n | tail -n2 ) 3>&1 # Correct
echo '#'
( tee >(head -n3 >&3 ) < /tmp/n | tail -n2 ) 3>&1 # Not correct!?
Run Code Online (Sandbox Code Playgroud)
1
2
3
999999
1000000
#
1
2
3
999999
1000000
#
1
2
3
15504
15
Run Code Online (Sandbox Code Playgroud)
为什么最后一行不输出与前两行相同的行?
这是因为head一旦传输了三条第一行就会退出.随后,tee使用SIGPIPE被杀死,因为它正在写入的"FILE"管道的读取端被关闭,但是直到它设法将某些行输出到它的stdout.
如果你执行这个:
tee >(head -n3 >/dev/null) < /tmp/n
Run Code Online (Sandbox Code Playgroud)
你会看到更好的事情.
OTOH,tac读取整个文件,因为它必须反转它sed,可能是一致的.
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |