tr
scheint seine Eingabe zu puffern, so dass dieser Befehl LongRunningCommand|tr \\n ,
erst dann eine Ausgabe erzeugt, wenn sich einige Kilobyte Eingabe von LongRunningCommand angesammelt haben.
Gibt es eine Möglichkeit, tr
das Puffern dieser Pufferung oder eines anderen Befehls zu erzwingen , der Zeilenumbrüche ohne Pufferung durch ein anderes Zeichen ersetzen kann?
PS Ich habe bereits die ersten beiden Vorschläge von Puffer in Pipe ausschalten ohne Erfolg ausprobiert .
stdbuf
Haben Sie sich bei LongRunningCommand oder bei tr oder bei beiden unterschiedlich beworben?stdbuf -o0 fping -aAq -r2 -g 10.30.0.1 10.30.0.255 2>/dev/null | stdbuf -i0 tr \\n ,
fping -q
sagt "Zeige keine Ergebnisse pro Sonde, sondern nur die endgültige Zusammenfassung", also schreibt es vielleicht nur ein langes Schreiben am Ende?tr
. Versuchen Sie|stdbuf -i0 -o0 tr ...
Antworten:
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 derread()
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) undtr
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 deaktivierentr
. Auf GNU- oder FreeBSD-Systemen: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).quelle
sed
. Entschuldigung, wenn es nervig war - aber ich wusste nicht, dass es Allgemeinwissen war. Ich denke, es verwendet LD_PRELOAD.Um Zeilenumbrüche durch zu ersetzen
","
, können Sie ausführenGNU awk (
gawk
) und Solarisnawk
werden mit Zeilenpufferung auf stdin und ohne Pufferung stdout ausgeführt, wenn die Ausgabe an ein Terminal erfolgt. Wenn Ihr awk istmawk
, was unter Ubuntu passiert, können Sie ihm die-W interactive
Option geben , dasselbe Pufferverhalten zu erhalten.quelle