stdout buffering

stdout - ¿Cómo hacer que la salida de cualquier comando de shell sea sin búfer?



buffering (4)

AFAIK, no puedes hacerlo sin feos hacks. Escribir en un conducto (o leer de él) activa automáticamente el almacenamiento en búfer completo y no hay nada que pueda hacer al respecto :-(. "Buffer de línea" (que es lo que desea) solo se usa al leer / escribir un terminal. feos hacks hacen exactamente esto: conectan un programa a un pseudo-terminal, de modo que las otras herramientas en el tubo leen / escriben desde ese terminal en el modo de almacenamiento en línea de línea. Todo el problema se describe aquí:

La página también tiene algunas sugerencias (los "feos hacks" antes mencionados) qué hacer, es decir, usar un unbuffer o hacer algunos trucos con LD_PRELOAD .

¿Hay alguna forma de ejecutar comandos de shell sin buffer de salida?

Por ejemplo, hexdump file | ./my_script hexdump file | ./my_script solo pasará la entrada de hexdump a my_script en fragmentos almacenados en búfer, no línea por línea.

En realidad, quiero saber una solución general de cómo hacer un comando sin búfer?



Pruebe stdbuf , incluido en coreutils de GNU y, por lo tanto, prácticamente cualquier distribución de Linux. Esto establece la duración del búfer para entrada, salida y error en cero:

stdbuf -i0 -o0 -e0 command


También podría usar el comando script para hacer que la salida de hexdump buffer de línea ( hexdump se ejecutará en un pseudo-terminal que engaña a hexdump para que piense que está escribiendo su stdout en un terminal, y no en un conducto).

# cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/ stty -echo -onlcr script -q /dev/null hexdump file | ./my_script # FreeBSD, Mac OS X script -q -c "hexdump file" /dev/null | ./my_script # Linux stty echo onlcr