Ich dachte, ich hätte alles in UNIX gesehen. Diese Frage hat mich aus meiner Selbstgefälligkeit gerissen. Was für eine tolle Frage!
tail
zeigt die letzten X Zeilen. tail -f
funktioniert 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, tail
muss es möglich sein, das Ende der Datei zu lokalisieren. Wenn tail
das Dateiende nicht gefunden wird, werden die letzten X-Zeilen nicht angezeigt, da "last" undefiniert ist. Was macht tail
man 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 tail
nach den letzten Zeilen einer Dateisystem-Pipe fragen . Erwägen:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
Das 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_lines
Funktionskommentar 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. head
hat 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 sed
und awk
brauchen weder einen Anfang noch ein Ende der Datei: Sie arbeiten mit Puffern.