`unbuffer` oder` stdbuf` zum entfernen von stdout buffering?

13

Gibt es einen Unterschied zwischen Unbuffer (1) und stdbuf (1)? Nach allem, was ich erfahre, macht Unuffer mehr als die "beste Anstrengung", den libc-Funktionssatz (X) buf am Anfang aufzurufen und dann die Dinge sein zu lassen?

dan3
quelle

Antworten:

14

Sie arbeiten auf ganz unterschiedliche Weise.

Der Programm-Unbuffer verwendet expect, um den benannten Befehl auszuführen. Da expect eine Pseudotty erstellt, die an die Standardausgabe des untergeordneten Prozesses angehängt werden kann, könnte das untergeordnete Element zu der Annahme verleitet werden, dass Zeilenpufferung anstelle von Blockpufferung verwendet werden sollte. Einige Programme ändern ihr Verhalten, wenn isatty (stdout) wahr ist, andere nicht und es ist sehr schwer zu wissen, welcher Wille und welcher nicht.

Das Programm stdbuf versucht, libstdbuf für dynamisch geladene Binärdateien vor libc zu stellen. Wobei libstdbuf die Standardpufferstrategie der libc stdio-Aufrufe neu definiert.

Ich fand das heraus durch

 apt-get source expect coreutils

und Lesen der relevanten Quelle für jedes Programm.

msw
quelle
Einige besorgniserregende Dinge (von der Manpage): unbuffer -pfunktionieren möglicherweise nicht richtig, wenn ein Prozess beendet wird, der Eingaben in den Unpuffer eingibt. Bedenken Sie: process1 | unbuffer -p process2 | process3Wenn process1 beendet wird, ist process2 möglicherweise noch nicht beendet. Es ist unmöglich für Unpuffer zu wissen, lange zu warten
dan3
Es scheint, dass stdbuf auch die stdin-Pufferung von Programmen steuern kann, die C-Streams verwenden, was wichtig zu sein scheint. Vielleicht sollte dies zum Wohle zukünftiger Leser in die Antwort aufgenommen werden.
Dan3