Befehle puffern ihre Eingabe im Allgemeinen nicht. Sie würden a read()
für einen großen Block ausführen, aber wenn beim Lesen aus einer Pipe nicht so viele Bytes in der Pipe vorhanden sind, wird der read()
Systemaufruf mit so vielen Zeichen zurückgegeben, wie es vorhanden ist, und die Anwendung arbeitet im Allgemeinen damit, wenn dies möglich ist .
Eine bemerkenswerte Ausnahme ist mawk
die , die so lange bestehen bleibt, read()
bis der Eingabepuffer voll ist.
Anwendungen puffern jedoch ihre Ausgabe (stdout). Das übliche Verhalten ist, dass, wenn die Ausgabe auf ein tty geht, die Pufferung zeilenweise erfolgt (das heißt, sie beginnt erst mit dem Schreiben in stdout, wenn eine vollständige Zeile ausgegeben werden muss oder ein Block voll für sehr lange Zeile), während für jeden anderen Dateityp die Pufferung durch Blöcke erfolgt (dh, der Schreibvorgang beginnt erst, wenn ein Block zum Schreiben voll ist (etwa 4 KB / 8 KB) ... hängt von der Software und dem System ab )).
In Ihrem Fall LongRunningCommand
puffert die Ausgabe also wahrscheinlich durch Blöcke (da die Ausgabe eine Pipe und keine tty ist) und tr
puffert die Ausgabe wahrscheinlich zeilenweise, da die Ausgabe wahrscheinlich das Terminal ist.
Da Sie jedoch jedes Zeilenumbruchzeichen aus seiner Ausgabe entfernen, wird niemals eine Zeile ausgegeben, sodass die Pufferung blockweise erfolgt.
Hier möchten Sie also die Pufferung für LongRunningCommand
und deaktivieren tr
. Auf GNU- oder FreeBSD-Systemen:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Beachten Sie, dass es besser ist, die Zeilen mit einem Komma zu verbinden paste -sd , -
. Auf diese Weise wird die Ausgabe durch ein Zeilenumbruchzeichen beendet (wahrscheinlich müssen Sie die Pufferung noch deaktivieren).
stdbuf
Haben Sie sich bei LongRunningCommand oder bei tr oder bei beiden unterschiedlich beworben?