Я думав, що бачив усе в UNIX. Це питання позбавило мене від саморобності. Яке чудове запитання!
tail
показує останні X рядки. tail -f
робить те саме, але по суті у нескінченному циклі: під час запуску покажіть останні X рядки файлу, потім, використовуючи деяку магію ОС (наприклад, ініціювати), відстежуйте та показуйте нові рядки.
Щоб виконати свою роботу, tail
необхідно вміти знаходити кінець файлу. Якщо tail
не вдається знайти кінець файлу, він не може показати останні X рядки, оскільки "останнє" не визначено. То що ж tail
робити в цьому випадку? Він чекає, поки він знайде кінець файлу.
Врахуйте це:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
Здається, це ніколи не має прогресу, оскільки ніколи не існує певного кінця файлу chatter
.
Ви отримуєте таку саму поведінку, якщо просите tail
дати вам останні рядки з каналу файлової системи. Поміркуйте:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
обійти сприйняту проблему була благородною спробою. Ключовим фактом є те, що буферизація вводу / виводу не є першопричиною: відсутність певного кінця файлу. Якщо ви перевірите вихідний код tail.c , ви побачите file_lines
коментар до функції:
END_POS - це зміщення файлу EOF (на один більший за зміщення останнього байта).
і це магія. Щоб хвіст працював у будь-якій конфігурації, вам потрібен кінець файлу. head
не має цього обмеження, воно просто потребує запуску файлу (якого він може не мати, спробуйте head test.pipe
). Стрім орієнтовані інструменти , як sed
і awk
потреби ні на початку або в кінці файлу: вони працюють на буферах.