Saya pikir saya telah melihat semuanya di UNIX. Pertanyaan ini menampar saya dari keangkuhan saya. Pertanyaan yang sangat bagus!
tailmenunjukkan garis X terakhir. tail -fmelakukan hal yang sama, tetapi pada dasarnya dalam loop tak terbatas: saat start-up, tunjukkan baris X terakhir dari file, kemudian gunakan beberapa keajaiban OS (seperti inotify), monitor dan tampilkan baris baru.
Untuk melakukan tugasnya, tailharus dapat menemukan akhir file. Jika tailtidak dapat menemukan ujung file, itu tidak dapat menunjukkan garis X terakhir, karena "terakhir" tidak ditentukan. Jadi apa yang taildilakukan dalam kasus ini? Itu menunggu sampai menemukan akhir file.
Pertimbangkan ini:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
Ini sepertinya tidak pernah membuat kemajuan, karena tidak pernah ada akhir file yang pasti chatter.
Anda mendapatkan perilaku yang sama jika Anda meminta tailuntuk memberikan baris terakhir dari pipa sistem file. Mempertimbangkan:
$ mkfifo test.pipe
$ tail test.pipe
stdbufuntuk mengatasi masalah yang dirasakan adalah upaya mulia. Fakta kuncinya adalah bahwa buffering I / O bukanlah penyebab utama: tidak adanya end-of-file yang pasti. Jika Anda memeriksa kode sumber tail.c , Anda akan melihat file_lineskomentar fungsi berbunyi:
END_POS adalah offset file EOF (satu lebih besar dari offset byte terakhir).
dan itulah keajaibannya. Anda memerlukan end-of-file agar tail dapat berfungsi dalam konfigurasi apa pun. headtidak memiliki batasan itu, hanya perlu memulai file (yang mungkin tidak, coba head test.pipe). Alat berorientasi aliran suka seddan awktidak membutuhkan awal atau akhir file: mereka bekerja pada buffer.