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.