it-swarm.cn

“ tail”命令的“ -f”参数如何工作?

$ tail -f testfile

该命令应该实时显示指定文件中的最新条目,对吗?但这没有发生。如果我的意图是错误的,请纠正我。

我创建了一个新文件“ aaa”,并添加了一行文本并将其关闭。然后发出此命令(第一行):

$ tail -f aaa
xxx
xxa
axx

最后三行是文件aaa的内容。现在命令仍在运行(因为我使用了-f),我通过GUI打开文件aaa,然后开始手动添加几行。但是终端不会显示文件中添加的新行。

怎么了tail -f命令仅在新条目仅由系统编写时才显示? (如日志文件等)

62
its_me

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代替。

66
Ignacio Vazquez-Abrams

您的编辑器有自己的文件缓冲区。在编辑器中修改文本时,不会将任何内容写入文件本身。

保存更改时,编辑器很可能会删除旧文件并创建一个新文件。 tail -f仍将连接到已删除的文件,因此不会显示任何新内容。

11
Stéphane Gimenez

tail默认每1秒“刷新”一次,而不是实时的。

试试这个(你需要bash4):

  • 打开2个端子。
  • 在第一终端执行touch ~/output.txttail -f ~/output.txt
  • 在第二个终端中执行for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • 查看第一个终端中tail的输出。
4
Rufo El Magufo