$ tail -f testfile
该命令应该实时显示指定文件中的最新条目,对吗?但这并没有发生。如果我的意图是错误的,请纠正我......
我创建了一个新文件“aaa”并添加了一行文本并将其关闭。然后发出这个命令(第一行):
$ tail -f aaa
xxx
xxa
axx
最后三行是文件 aaa 的内容。现在命令仍在运行(因为我使用了-f
),我通过 GUI 打开文件 aaa 并开始手动添加更多行。但终端不显示文件中添加的新行。
这是怎么回事?该tail -f
命令仅显示仅由系统写入的新条目吗? (如日志文件等)
答案1
来自tail(1)
手册页:
With --follow (-f), tail defaults to following the file descriptor, which means that even if a tail’ed file is renamed, tail will continue to track its end. This default behavior is not desirable when you really want to track the actual name of the file, not the file descrip- tor (e.g., log rotation). Use --follow=name in that case. That causes tail to track the named file in a way that accommodates renaming, removal and creation.
您的文本编辑器正在重命名或删除原始文件,并将新文件保存在相同的文件名下。代替使用-F
。
答案2
您的编辑器有自己的文件缓冲区。当您在编辑器中修改文本时,不会向文件本身写入任何内容。
当您保存更改时,编辑器很可能只是删除旧文件并创建一个新文件。tail -f
仍将连接到已删除的文件,因此不会显示任何新内容。
答案3
tail
默认情况下每 1 秒“刷新”一次,而不是实时。
尝试一下(你需要 bash4):
- 打开2个终端。
- 在第一个终端中执行
touch ~/output.txt
和tail -f ~/output.txt
。 - 在第二个终端执行
for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
- 查看第一个终端中 tail 的输出。