`unbuffer` o` stdbuf` per rimuovere il buffering stdout?


13

C'è una differenza tra unbuffer (1) e stdbuf (1)? Da quello che raccolgo, unbuffer fa di più del "miglior sforzo" di chiamare il buf set di funzioni libc (X) all'inizio, e poi lasciare che le cose siano?

Risposte:


14

Funzionano in modi completamente diversi.

Il programma unbuffer utilizza prevede di eseguire il comando denominato. Poiché prevedere crea uno pseudo-tty da associare allo stdout del processo figlio, il bambino potrebbe essere ingannato nel pensare che dovrebbe usare il buffering di linea anziché il buffering di blocco. Alcuni programmi cambieranno il loro comportamento quando isatty (stdout) è vero, altri no ed è molto difficile sapere quale sarà e quale no.

Il programma stdbuf tenta di mettere libstdbuf davanti a libc per i binari caricati dinamicamente. Dove libstdbuf ridefinisce la strategia di buffering predefinita delle chiamate stdio di libc.

L'ho scoperto da

 apt-get source expect coreutils

e leggendo la fonte pertinente per ciascun programma.


Alcune cose preoccupanti (dalla manpage): unbuffer -ppotrebbe sembrare che funzioni in modo errato se esce un processo che alimenta l'input verso il buffer. Considerare: process1 | unbuffer -p process2 | process3se termina process1, è possibile che process2 non sia ancora terminato. È impossibile per il non
amico

Sembra che stdbuf possa anche controllare il buffering stdin dei programmi che usano flussi C, il che sembra importante. Forse questo dovrebbe essere incluso nella risposta a beneficio dei futuri lettori.
dan3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.