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?
El comando unbuffer
del paquete expect
deshabilita el almacenamiento en búfer de salida:
Manpage de Ubuntu: unbuffer - salida de unbuffer
Ejemplo de uso:
unbuffer hexdump file | ./my_script
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