Es gibt eine allgemeine Pufferregel, die von der C-Standard-E / A-Bibliothek ( stdio
) befolgt wird, die die meisten Unix-Programme verwenden. Wenn die Ausgabe an ein Terminal gesendet wird, wird sie am Ende jeder Zeile gelöscht. Andernfalls wird es nur geleert, wenn der Puffer (8 KB auf meinem Linux / amd64-System; könnte bei Ihnen anders sein) voll ist.
Wenn alle Dienstprogramme , die allgemeine Regel folgende, würden Sie die Ausgabe in alle Ihre Beispiele sehen verzögert ( cat|sed
, cat|tr
und cat|tr|sed
). Aber es gibt eine Ausnahme: GNU cat
puffert niemals seine Ausgabe. Entweder wird stdio
die Standardpufferrichtlinie nicht verwendet oder geändert stdio
.
Ich kann ziemlich sicher sein, dass Sie GNU cat
und kein anderes Unix verwenden, cat
da sich die anderen nicht so verhalten würden. Herkömmliches Unix cat
bietet die -u
Möglichkeit, ungepufferte Ausgaben anzufordern. GNU cat
ignoriert die -u
Option, da die Ausgabe immer ungepuffert ist.
Wenn Sie also eine Pipe mit einem cat
links im GNU-System haben, wird der Durchgang von Daten durch die Pipe nicht verzögert. Das cat
geht nicht mal Zeile für Zeile - das macht Ihr Terminal. Während Sie Eingaben für cat eingeben, befindet sich Ihr Terminal im "kanonischen" Modus - zeilenbasiert. Mit Bearbeitungstasten wie Rücktaste und Strg-U haben Sie die Möglichkeit, die eingegebene Zeile vor dem Senden zu bearbeiten Enter.
In diesem cat|tr|sed
Beispiel werden tr
weiterhin Daten von empfangen, cat
sobald Sie auf drücken Enter, es tr
wird jedoch die stdio
Standardrichtlinie befolgt: Die Ausgabe wird an eine Pipe gesendet, sodass nicht nach jeder Zeile eine Leerung erfolgt. Es schreibt in die zweite Pipe, wenn der Puffer voll ist oder wenn eine EOF empfangen wird, je nachdem, was zuerst eintritt.
sed
folgt ebenfalls der stdio
Standardrichtlinie, aber die Ausgabe wird an ein Terminal gesendet, sodass jede Zeile geschrieben wird, sobald sie fertig ist. Dies hat Auswirkungen darauf, wie viel Sie eingeben müssen, bevor etwas am anderen Ende der Pipeline angezeigt wird. Wenn sed
Sie die Ausgabe blockpuffern, müssen Sie doppelt so viel eingeben (um tr
den Ausgabepuffer und sed
die Ausgabe zu füllen) Puffer).
GNU sed
hat die -u
Option, dass, wenn Sie die Reihenfolge umkehren und verwenden cat|sed -u|tr
, die Ausgabe sofort wieder angezeigt wird. (Die sed -u
Option könnte an anderer Stelle verfügbar sein, aber ich glaube nicht, dass es sich um eine alte Unix-Tradition handelt. cat -u
) Soweit ich das beurteilen kann, gibt es für keine entsprechende Option tr
.
Es gibt ein Hilfsprogramm, mit stdbuf
dem Sie den Puffermodus jedes Befehls ändern können, der die stdio
Standardeinstellungen verwendet. Es ist ein bisschen zerbrechlich, da es verwendet wird LD_PRELOAD
, um etwas zu erreichen, für das die C-Bibliothek nicht entwickelt wurde, aber in diesem Fall scheint es zu funktionieren:
cat | stdbuf -o 0 tr '[:lower:]' '[:upper:]' | sed 'p'
cat
puffert, bis stdin sich schließt.