tail
est de lire le fichier
séquentiellement, depuis le début, en gardant dans un tampon circulaire
les N dernières lignes lues. Quand on atteint la fin du fichier, on
affiche le tampon. Il n’y a rien de mieux à faire quand les données
proviennent d’un tuyau ou d’un fichier spécial qui n’implémente pas
lseek
. Si les données proviennent d’un fichier normal, il vaut mieux
lire le fichier en partant de la fin: avec lseek
, on lit les 4096 derniers
caractères; on les balaye pour compter les retours à la ligne; s’il y
en a au moins N, on affiche les N lignes correspondantes et on
sort; sinon, on recommence en ajoutant les 4096 caractères précédents,
etc.Pour ajouter l’option -f
, il suffit, une fois qu’on a affiché
les N dernières lignes, de se positionner à la fin du fichier, et
d’essayer de lire (par read
) à partir de là. Si read
réussit à
lire quelque chose, on l’affiche aussitôt et on recommence. Si read
renvoie 0, on attend un peu (sleep 1
), et on recommence.