Saya pikir saya telah melihat semuanya di UNIX. Pertanyaan ini menampar saya dari keangkuhan saya. Pertanyaan yang sangat bagus!
tail
menunjukkan garis X terakhir. tail -f
melakukan 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, tail
harus dapat menemukan akhir file. Jika tail
tidak dapat menemukan ujung file, itu tidak dapat menunjukkan garis X terakhir, karena "terakhir" tidak ditentukan. Jadi apa yang tail
dilakukan 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 tail
untuk memberikan baris terakhir dari pipa sistem file. Mempertimbangkan:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
untuk 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_lines
komentar 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. head
tidak memiliki batasan itu, hanya perlu memulai file (yang mungkin tidak, coba head test.pipe
). Alat berorientasi aliran suka sed
dan awk
tidak membutuhkan awal atau akhir file: mereka bekerja pada buffer.