加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 行为不端的重定向

发布时间:2020-12-16 01:15:57 所属栏目:安全 来源:网络整理
导读:在对 Piping a file through tail and head via tee的回复中,在使用大文件时,在以下构造中观察到了头部的奇怪行为: #! /bin/bashfor i in {1..1000000} ; do echo $i ; done /tmp/n( tee (sed -n '1,3p' 3 ) /tmp/n | tail -n2 ) 31 # Correctecho '#'( tee
在对 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一样,可能是一致的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读