Vereinfachte Erklärung
Wie bei vielen Dienstprogrammen grep
variiert auch dies, da es sich nicht um eine Besonderheit eines Programms handelt, die Standardausgabe zwischen Zeilen- und Vollpufferung . Im ersteren Fall puffert die C-Bibliothek die Ausgabedaten im Speicher, bis entweder der Puffer, der diese Daten enthält, gefüllt ist oder ein Zeilenvorschubzeichen hinzugefügt ist (oder das Programm sauber endet), woraufhin es aufruft write()
, den Pufferinhalt tatsächlich zu schreiben. Im letzteren Fall löst nur der In-Memory-Puffer, der voll wird (oder das Programm endet sauber), den aus write()
.
Detailliertere Erklärung
Dies ist die bekannte, aber leicht falsche Erklärung. Tatsächlich wird die Standardausgabe in der GNU C-Bibliothek und der BSD C-Bibliothek nicht zeilen-, sondern intelligent gepuffert . Standardausgabe ist auch gespült , wenn Standard - Leseeingangs erschöpft seine in-Speicherpuffer (der Vor-Lese - Eingang) und die C - Bibliothek aufrufen read()
etwas mehr Eingabe zu holen und es ist , den Anfang einer neuen Zeile zu lesen. (Ein Grund dafür ist, ein Deadlock zu verhindern, wenn sich ein anderes Programm mit beiden Enden eines Filters verbindet und erwartet, dass es zeilenweise abwechselnd auf den Filter schreiben und von ihm lesen kann, wie "Coprozesse" in GNU awk
beispielsweise.)
C Bibliothekseinfluss
grep
und die anderen Dienstprogramme tun dies - oder genauer gesagt die C-Bibliotheken, die sie verwenden -, da dies eine definierte Funktion der Programmierung in der C-Sprache ist - basierend auf dem, was sie als Standardausgabe erkennen. Wenn (und nur wenn) es sich nicht um ein interaktives Gerät handelt, wählen sie die vollständige Pufferung, andernfalls wählen sie die intelligente Pufferung. Eine Pipe wird nicht als interaktives Gerät betrachtet, da die Definition eines interaktiven Geräts, zumindest in der Welt von Unix und Linux, im Wesentlichen die isatty()
Rückgabe von true für den entsprechenden Dateideskriptor ist.
Problemumgehungen zum Deaktivieren der vollständigen Pufferung
Einige Dienstprogramme wie grep
haben eigenwillige Optionen wie --line-buffered
diese, die diese Entscheidung ändern, was, wie Sie sehen, falsch benannt ist. Aber ein verschwindend kleiner Teil der Filterprogramme, die man verwenden könnte, hat tatsächlich eine solche Option.
Im Allgemeinen kann man Tools verwenden, die in die spezifischen Interna der C-Bibliothek eingreifen und deren Entscheidungsfindung ändern (die Sicherheitsprobleme aufweisen, wenn das zu ändernde Programm eine Set-UID hat, und die auch für bestimmte C-Bibliotheken spezifisch sind und tatsächlich sind) B. Programme, die in der Programmiersprache C geschrieben sind oder über der Programmiersprache C liegen), oder Tools ptybandage
, die die Interna des Programms nicht ändern, sondern einfach ein Pseudoterminal als Standardausgabe einfügen, damit die Entscheidung als "interaktiv" ausfällt beeinflussen dies.
Weitere Lektüre
cat
verkettet Dateien. Was versuchst du zu tun, indem du hineinpfeifstcat
?