我使用 打开了一个文件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 X
inode 现在指向 ,X~
而X
具有新的 inode。Vim 可能以相同的方式工作,或者它可能只是删除原始X
文件并创建一个新文件。(Unix 不会删除文件,直到对它的所有 inode 引用都消失,因此,假设没有其他指向 的硬链接X
,您的tail -f
旧X
文件将保持“活动”。)
当您运行 时echo foo >> X
,echo 命令将打开X
以进行附加;因此,在文件附加并关闭后,inode 不会发生变化。
-i
您可以使用中的开关轻松查看文件的 inode ls
。