Estoy tratando de usar stdbuf
para controlar el buffering de un proceso en la terminal, específicamente usando stdbuf -o0
para evitar el buffering al redirigir la salida, más o menos como se describe en esta respuesta, pero no parece funcionar como se espera, o de hecho tener algún efecto. Compare la salida de los siguientes comandos:
{ echo 'foo' ; sleep 2 ; echo 'boo'} | grep 'oo'
{ echo 'foo' ; sleep 2 ; echo 'boo'} | grep 'oo' | cat
{ echo 'foo' ; sleep 2 ; echo 'boo'} | stdbuf -o0 grep 'oo' | cat
{ echo 'foo' ; sleep 2 ; echo 'boo'} | stdbuf -o1M grep 'oo'
En el primero, grep procesa y muestra cada línea según se recibe. En el segundo, la salida aparece toda junta después de 2 segundos, como se explica aquí, grep hace buffering de su salida cuando no la envía a una terminal. Ambos son como se espera. El tercero es la sorpresa: según la primera respuesta enlazada y toda otra documentación/discusión que he encontrado, stdbuf -o0
debería evitar que grep haga buffering de su salida, por lo que esto debería actuar como el primer comando. Sin embargo, en mis Macs actúa como el segundo comando, la salida llega toda junta después de 2 segundos. De manera similar, el cuarto comando debería (según entiendo) hacer que grep haga buffering de su salida, y por lo tanto actuar como el segundo, pero no lo hace, da una salida incremental como el primero.
¿Por qué stdbuf
no tiene ningún efecto aquí? ¿Los demás usuarios de Mac obtienen los mismos resultados? ¿Y hay alguna forma alternativa de prevenir el buffering de manera general en las tuberías? He probado con stdbuf -oL
(buffering de línea), y esto tampoco tiene ningún efecto. También lo he intentado con gstdbuf
, es decir, la versión instalada por coreutils
de Homebrew, y tampoco tiene efecto; tanto stdbuf
como gstdbuf
son de la versión 9.5. Lo he intentado en tres Macs, corriendo Sonoma 14.4.1 y Ventura 13.6.6, y Monterey 12.7.4, con resultados idénticos. He probado con unbuffer
del paquete expect; eso tampoco tiene ningún efecto aquí. Y lo he probado con otros objetivos de la cadena de tuberías además de cat
; todos parecen mostrar el mismo comportamiento.
La opción específica de grep --line-buffered
sí funciona, al igual que reemplazar grep
por ag
, que no hace buffering por defecto en las tuberías. Sin embargo, mi caso de uso real es con ripgrep-all (rga
) que hace buffering en las tuberías como grep pero no ofrece una opción de buffering de línea o sin buffering, y parece ser un problema general con stdbuf
y unbuffer
(no encuentro ningún caso en el que parezcan tener algún efecto), así que realmente me gustaría encontrar una respuesta general si es posible.