Я думав, що бачив усе в 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потреби ні на початку або в кінці файлу: вони працюють на буферах.