为什么以下命令不产生任何输出?
$ tail -f /etc/passwd | tail
阅读有关缓冲的内容后,我尝试了以下操作,但无济于事:
$ tail -f /etc/passwd | stdbuf -oL tail
请注意,以下内容确实会产生输出:
$ tail /etc/passwd | tail
这样做是这样的:
$ tail -f /etc/passwd | head
我正在使用尾部版本8.21(GNU coreutils)。
tail
显示最后的X行。tail -f
这样做是一样的,但本质上是无限循环的:在启动时,显示文件的最后X行,然后使用一些OS魔术(如inotify),监视并显示新行。
要执行其工作,tail
必须能够找到文件的末尾。如果tail
找不到文件的末尾,则无法显示最后X行,因为“ last”是未定义的。那么tail
在这种情况下该怎么办?等待直到找到文件结尾。
考虑一下:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
这似乎从未取得进展,因为from永远不会有明确的文件结尾chatter
。
如果您要求tail
提供文件系统管道的最后几行,则会得到相同的行为。考虑:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
解决这个问题是一种崇高的尝试。但是关键事实是I / O缓冲不是根本原因:缺少明确的文件结尾是。如果您查看tail.c源代码,您将看到file_lines
函数注释显示为:
END_POS是EOF的文件偏移量(比最后一个字节的偏移量大1)。
这就是魔术。您需要文件尾才能在任何配置中使用tail。head
没有该限制,它只需要一个文件开始(它可能没有,请尝试head test.pipe
)。面向流的工具(例如,sed
并且awk
不需要文件的开头或结尾):它们在缓冲区上工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句