使用编辑器编辑文件时,Tail -f 不显示文件更新

使用编辑器编辑文件时,Tail -f 不显示文件更新

我使用 打开了一个文件tail -f <filename,并尝试使用从另一个选项卡向同一文件中附加一些文本vim,更新的内容没有显示。但如果我使用它附加一些文本,echo它就可以正常工作。有什么具体我不知道的吗?

尾巴手册页说:

-f, --follow[={name|descriptor}] 随着文件增大输出附加数据;

答案1

Vim(或任何文本编辑器)在编辑时会保留两个文件,即编辑的文件和新文件。新文件只有一个临时名称。当 Vim 更新文件时,它实际上只是重命名新文件并删除旧文件。

man页面显示:

使用 --follow (-f) 时,tail 默认跟踪文件描述符,这意味着即使 tail 文件被重命名,tail 仍将继续跟踪其结尾。当您真正想要跟踪文件的实际名称而不是文件描述符(例如,日志轮换)时,这种默认行为并不可取。在这种情况下,请使用 --follow=name。这会导致 tail 以适应重命名、删除和创建的方式跟踪命名文件。

您需要指定name要跟踪的具有该名称的文件,而不管其文件描述符是什么(仅在文件仍然打开时才有效)。

使用命令如下:

tail --follow=name filename

答案2

在 Unix 中,文件按名称打开,但按 inode 引用。如果您在 Emacs 中tail -f X单击 ,然后X在 Emacs 中打开(例如),在您进行更改并保存文件后,Emacs 会将原始文件重命名为 ,X~并写出一个名为 的新文件X。您的tail -f Xinode 现在指向 ,X~X具有新的 inode。Vim 可能以相同的方式工作,或者它可能只是删除原始X文件并创建一个新文件。(Unix 不会删除文件,直到对它的所有 inode 引用都消失,因此,假设没有其他指向 的硬链接X,您的tail -fX文件将保持“活动”。)

当您运行 时echo foo >> X,echo 命令将打开X以进行附加;因此,在文件附加并关闭后,inode 不会发生变化。

-i您可以使用中的开关轻松查看文件的 inode ls

相关内容