Ich dachte, ich hätte alles in UNIX gesehen. Diese Frage hat mich aus meiner Selbstgefälligkeit gerissen. Was für eine tolle Frage!
tailzeigt die letzten X Zeilen. tail -ffunktioniert genauso, aber im Wesentlichen in einer Endlosschleife: Zeigen Sie beim Start die letzten X Zeilen der Datei an, und verwenden Sie dann etwas Magie des Betriebssystems (wie inotify), überwachen Sie und zeigen Sie neue Zeilen an.
Um seine Arbeit zu erledigen, tailmuss es möglich sein, das Ende der Datei zu lokalisieren. Wenn taildas Dateiende nicht gefunden wird, werden die letzten X-Zeilen nicht angezeigt, da "last" undefiniert ist. Was macht tailman in diesem Fall? Es wartet, bis es das Ende der Datei findet.
Bedenken Sie:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
Dies scheint niemals Fortschritte zu machen, da es nie ein definitives Dateiende gibt chatter.
Sie erhalten das gleiche Verhalten, wenn Sie tailnach den letzten Zeilen einer Dateisystem-Pipe fragen . Erwägen:
$ mkfifo test.pipe
$ tail test.pipe
stdbufDas wahrgenommene Problem zu umgehen war ein nobler Versuch. Die wichtigste Tatsache ist jedoch, dass die E / A-Pufferung nicht die Hauptursache ist: Das Fehlen eines bestimmten Dateiendes ist die Ursache. Wenn Sie den Quellcode von tail.c auschecken , wird der file_linesFunktionskommentar wie folgt angezeigt :
END_POS ist der Dateiversatz von EOF (einer größer als der Versatz des letzten Bytes).
und das ist die Magie. Sie benötigen ein Dateiende, damit tail in jeder Konfiguration funktioniert. headhat diese Einschränkung nicht, es braucht nur einen Dateianfang (was es vielleicht nicht hat, versuchen Sie es head test.pipe). Stream-orientierte Tools mögen sedund awkbrauchen weder einen Anfang noch ein Ende der Datei: Sie arbeiten mit Puffern.