Я использую команду:
tail -f -n 0 file.txt
Но она продолжает повторяться.
Я делаю следующее:
Создайте файл в первом терминале: touch file.txt
Начать хвост во втором терминале: tail -f -n 0 file.txt
Редактировать файл в первом терминале: nano file.txt
Просто добавьте text
, сохраните и закройте. Вторая клемма выводит text
так, как должно.
Снова отредактируйте файл в первом терминале: nano file.txt
Добавьте в конец (2-я строка) 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
Я также не знаю, почему он выдает обрезанное сообщение. Я начинаю вставлять новый текст в конец файла.
Во-первых, Вы получаете ошибку, потому что Вы используете текстовый редактор для этого. Это означает, что каждый раз Вы открываете файл, редактируете и сохраняете его, оригинал перезаписывается с новым содержанием. Добавили ли Вы, что одна строка в конец или 100 строк повсеместно не важны, дело в том, что файл открыт, отредактирован и сохранен, и это перезаписывает содержание.
Например, сравните свой рабочий процесс с выполнением этого:
for((i=0;i<20;i++)); do echo $i >> file.txt; sleep 1; done
Это запишет число в file.txt
каждую секунду в течение двадцати секунд. Если Вы открываете другой терминал и работаете tail -fn 0 file.txt
, Вы будете видеть вывод, который Вы ожидаете.
Так, для получения желаемого поведения добавляют текст к использованию файла >>
от терминала вместо того, чтобы вручную редактировать его.
nano
кажется, нечетный здесь. Большинство редакторов при открытии файла, затем сохраняющего его, на самом деле удалит исходный файл и сохранит новый с тем же именем. Можно протестировать это путем проверки inode количества файла:
$ ls -il file.txt
16647801 -rw-r--r-- 1 terdon terdon 9 Apr 6 18:19 file.txt
Файлы просто hardlinks к определенному inodes, в этом случае, 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
вообще.
Как указано в одном из других ответов уже, это происходит, потому что Ваш файл перезаписывается каждый раз, когда Вы сохранили файл. Команда хвоста была разработана для контроля файлов журнала, в которых новые строки добавляются в файл.
В этой конкретной ситуации я использовал бы следующее в качестве обходного решения:
watch -n 1 cat file.txt
команда часов периодически выполняет команду. Интервал обновления, в секундах, определяется с -n
и может быть скорректирован к Вашей симпатии.