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|trund cat|tr|sed). Aber es gibt eine Ausnahme: GNU catpuffert niemals seine Ausgabe. Entweder wird stdiodie Standardpufferrichtlinie nicht verwendet oder geändert stdio.
Ich kann ziemlich sicher sein, dass Sie GNU catund kein anderes Unix verwenden, catda sich die anderen nicht so verhalten würden. Herkömmliches Unix catbietet die -uMöglichkeit, ungepufferte Ausgaben anzufordern. GNU catignoriert die -uOption, da die Ausgabe immer ungepuffert ist.
Wenn Sie also eine Pipe mit einem catlinks im GNU-System haben, wird der Durchgang von Daten durch die Pipe nicht verzögert. Das catgeht 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|sedBeispiel werden trweiterhin Daten von empfangen, catsobald Sie auf drücken Enter, es trwird jedoch die stdioStandardrichtlinie 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.
sedfolgt ebenfalls der stdioStandardrichtlinie, 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 sedSie die Ausgabe blockpuffern, müssen Sie doppelt so viel eingeben (um trden Ausgabepuffer und sed die Ausgabe zu füllen) Puffer).
GNU sedhat die -uOption, dass, wenn Sie die Reihenfolge umkehren und verwenden cat|sed -u|tr, die Ausgabe sofort wieder angezeigt wird. (Die sed -uOption 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 stdbufdem Sie den Puffermodus jedes Befehls ändern können, der die stdioStandardeinstellungen 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'
catpuffert, bis stdin sich schließt.