команда tail не получает только новые строки

Я использую команду:

tail -f -n 0 file.txt

Но она продолжает повторяться.


  1. Я делаю следующее:

  2. Создайте файл в первом терминале: touch file.txt

  3. Начать хвост во втором терминале: tail -f -n 0 file.txt

  4. Редактировать файл в первом терминале: nano file.txt

  5. Просто добавьте text, сохраните и закройте. Вторая клемма выводит text так, как должно.

  6. Снова отредактируйте файл в первом терминале: nano file.txt

  7. Добавьте в конец (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

Я также не знаю, почему он выдает обрезанное сообщение. Я начинаю вставлять новый текст в конец файла.

4
задан 6 April 2014 в 20:14

2 ответа

Во-первых, Вы получаете ошибку, потому что Вы используете текстовый редактор для этого. Это означает, что каждый раз Вы открываете файл, редактируете и сохраняете его, оригинал перезаписывается с новым содержанием. Добавили ли Вы, что одна строка в конец или 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 вообще.

13
ответ дан 6 April 2014 в 20:14

Как указано в одном из других ответов уже, это происходит, потому что Ваш файл перезаписывается каждый раз, когда Вы сохранили файл. Команда хвоста была разработана для контроля файлов журнала, в которых новые строки добавляются в файл.

В этой конкретной ситуации я использовал бы следующее в качестве обходного решения:

watch -n 1 cat file.txt

команда часов периодически выполняет команду. Интервал обновления, в секундах, определяется с -n и может быть скорректирован к Вашей симпатии.

0
ответ дан 6 April 2014 в 20:14

Другие вопросы по тегам:

Похожие вопросы: