【发布时间】:2013-08-14 08:59:41
【问题描述】:
随着我们的 SuSE Enterprise Linux 11(现在是 bash 3.2.51(1)-release)的最后一次更新,命令“tail”似乎失去了流文件的选项:
tail: unrecognized option '--line-buffered'
我们的尾巴来自“GNU coreutils 8.12,2013 年 3 月”。还有其他等效的解决方案吗?
【问题讨论】:
随着我们的 SuSE Enterprise Linux 11(现在是 bash 3.2.51(1)-release)的最后一次更新,命令“tail”似乎失去了流文件的选项:
tail: unrecognized option '--line-buffered'
我们的尾巴来自“GNU coreutils 8.12,2013 年 3 月”。还有其他等效的解决方案吗?
【问题讨论】:
就可以通过简单的谷歌搜索得知,tail 似乎没有--line-buffered 选项,grep 有。 --line-buffered 用于强制行缓冲,即使在写入非 TTY 时也是如此,典型的习惯用法是:
tail -f FILE | grep --line-buffered REGEXP > output
这里--line-buffered的目的是防止grep以8K块的形式缓冲输出并强制匹配的行立即出现在输出文件中。
tail -f 无论输出类型如何都是无缓冲的,因此它不需要与grep 中的选项等效的--line-buffered 选项。这可以通过运行tail -f somefile | cat 并从另一个shell 向文件附加一行来验证。有人观察到,尽管它的标准输出是管道,tail 会立即刷新新到达的行。
【讨论】:
tail 等待 换行。
tail -f foo | cat 后跟 printf xxx >> foo 在另一个 shell 中立即在 tail/cat 输出屏幕上显示 xxx。即使tail 确实等待换行符,但--line-buffered 也无济于事。
tail -f 同时有几个文件,则输出 不是 行缓冲,但如果这些文件以并行方式附加,则输入的组合会出现乱码。例如。拖尾一些日志文件。实际上,拖尾一些文件并以行缓冲的方式将它们的输出交给 grep 是一个似乎根本没有简单解决方案的问题。这都是因为尾部没有--line-buffered 选项。
write(2))。您似乎在以不同的非标准意义使用该术语,意思是“不要混合来自不同文件的不完整行”。虽然这种基于行的输出一致性在拖尾多个日志文件时将是一个非常有用的功能,但它与通常理解的行缓冲无关。