我正在使用以下命令:
tail -f -n 0 file.txt
但它不断重演。
我正在做的事情如下:
在第一个终端中创建文件:
touch file.txt
在第二个终端启动尾部:
tail -f -n 0 file.txt
在第一个终端中编辑该文件:
nano file.txt
只需添加
text
、保存并关闭。第二个终端输出text
应有的输出。在第一个终端中再次编辑该文件:
nano file.txt
在最后(第二行)添加
more text
,保存并关闭。第二个终端输出:
tail: file.txt: 文件截断
文本
更多文本
在第一个终端中再次编辑该文件:nano file.txt
在最后添加(第 3 行)even more text
,保存并关闭。第二个终端输出even more text
应有的输出。
在第一个终端中再次编辑该文件:nano file.txt
在最后(第4行)添加and even more text
,保存关闭。第二个终端输出:
tail: file.txt: file truncated
text
more text
even more text
and even more text
我需要命令不要重复。
输出结果为:
tail -f -n 0 file.txt
text
tail: file.txt: file truncated
text
more text
even more text
tail: file.txt: file truncated
text
more text
even more text
and even more text
我需要它输出:
tail -f -n 0 file.txt
text
more text
even more text
and even more text
或者,如果无法删除“文件被截断”消息,则可以执行以下操作:
tail -f -n 0 file.txt
text
tail: file.txt: file truncated
more text
even more text
tail: file.txt: file truncated
and even more text
我也不知道为什么它会显示文件被截断的消息。我开始在文件末尾插入新文本。
答案1
首先,您之所以会收到错误,是因为您使用的是文本编辑器。这意味着每次打开、编辑和保存文件时,原始内容都会被新内容覆盖。无论您是在末尾添加了一行还是在各处添加了 100 行都无关紧要,重点是文件正在被打开、编辑和保存,并且会覆盖内容。
例如,将您的工作流程与运行以下内容进行比较:
for((i=0;i<20;i++)); do echo $i >> file.txt; sleep 1; done
file.txt
这将在二十秒内每秒写入一个数字。如果您打开另一个终端并运行tail -fn 0 file.txt
,您将看到预期的输出。
>>
因此,为了获得所需的行为,请使用终端将文本添加到文件中,而不是手动编辑它。
更多细节
nano
似乎是这里奇怪的一个。大多数编辑器在打开文件然后保存时实际上会删除原始文件并保存一个同名的新文件。您可以通过检查索引节点号文件:
$ ls -il file.txt
16647801 -rw-r--r-- 1 terdon terdon 9 Apr 6 18:19 file.txt
文件只是指向特定 inode 的硬链接,在本例中file.txt
指向 inode 16647801
。现在,在 中打开文件gedit
,添加一行并再次检查 inode :
$ gedit file.txt
$ ls -il file.txt
16647854 -rw-r--r-- 1 terdon terdon 13 Apr 6 18:23 file.txt
如您所见,inode 编号已更改,换句话说,原始文件已被删除并创建了一个新文件。nano
不会发生这种情况,尝试使用相同的操作nano
不会更改 inode。 但是,它会删除原始内容并用新内容覆盖它们。 这就是为什么实际上显示输出的原因,如果您尝试使用(或许多其他编辑器)tail
编辑文件,您添加的额外行根本不会显示在输出中。gedit
emacs
tail
答案2
正如其他答案中所述,发生这种情况是因为每次保存文件时文件都会被覆盖。 tail 命令旨在监视将新行附加到文件中的日志文件。
在这种特殊情况下,我将使用以下方法作为解决方法:
watch -n 1 cat file.txt
watch 命令定期执行命令。更新间隔(以秒为单位)用 指定,-n
并可根据您的喜好进行调整。