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

“tail”命令的“-f”参数如何工作?
$ 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.txttail -f ~/output.txt
  • 在第二个终端执行for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • 查看第一个终端中 tail 的输出。

相关内容