bash - 带有重定向的行为不端的头部

标签 bash pipe io-redirection tee

在对 Piping a file through tail and head via 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!?

输出:

1
2
3
999999
1000000
#
1
2
3
999999
1000000
#
1
2
3
15504
15

问题:

为什么最后一行输出的行和前两行不一样?

最佳答案

这是因为 head 刚传输完前三行就退出了。随后,tee 被 SIGPIPE 杀死,因为它正在写入的“FILE”管道的读取端已关闭,但直到它设法将一些行输出到其标准输出。

如果你只执行这个:

tee >(head -n3 >/dev/null) < /tmp/n

你会看到更好的结果。

OTOH,tac 读取整个文件,因为它必须反转它,sed 也是如此,可能是为了保持一致。

关于bash - 带有重定向的行为不端的头部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16664257/

相关文章:

shell - 在 shell 中使用管道执行变量

linux - 符号 -、< 和 > 是什么意思?

c - 创建子进程时重定向输出问题。在 POSIX 中编写自己的 Shell

Powershell:捕获组合输出,仅错误输出,将组合输出发送到控制台

xml - 使用 shell 脚本从 xml 文件中提取最新版本

linux - 依次运行 3 个作业

linux - 使用脚本编号和复制具有奇数和偶数的文件

linux - 您如何访问您在 Bash 中获取的文件的基本文件名?

javascript - 为什么我的 Ramda 管道功能不能与过滤器一起使用?

windows - 为什么 XCOPY/W 和 REPLACE/W 为它们的单字符提示消耗所有重定向的文本数据?