it-swarm-ru.tech

Как работает параметр "-f" команды "tail"?

$ tail -f testfile

команда должна показывать последние записи в указанном файле в реальном времени, верно? Но этого не происходит. Пожалуйста, поправьте меня, если то, что я намерен сделать, неправильно ...

Я создал новый файл "aaa", добавил строку текста и закрыл ее. Затем выполните эту команду (первая строка):

$ tail -f aaa
xxx
xxa
axx

последние три строки - содержимое файла aaa. Теперь, когда команда все еще выполняется (так как я использовал -f), Я открыл файл aaa через графический интерфейс и начал добавлять еще несколько строк вручную. Но терминал не показывает новые строки, добавленные в файл.

Что здесь не так? tail -f команда показывает только новые записи, если они записаны только системой? (например, файлы журналов и т. д.)

62
its_me

Из tail(1)man-страница :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

Ваш текстовый редактор переименовывает или удаляет исходный файл и сохраняет новый файл под тем же именем файла. Используйте -F вместо.

66
Ignacio Vazquez-Abrams

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

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

11
Stéphane Gimenez

tail "обновлять" каждую 1 секунду по умолчанию, а не в реальном времени.

Попробуйте с этим (вам нужен bash4):

  • Откройте 2 терминала.
  • В первом терминале выполните touch ~/output.txt а также tail -f ~/output.txt.
  • Во втором терминале выполните for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Посмотрите на вывод tail в первом терминале.
4
Rufo El Magufo