Por lo general, stdout
tiene memoria intermedia. En otras palabras, siempre que su argumento printf
termine con una nueva línea, puede esperar que la línea se imprima instantáneamente. Esto no parece sostenerse cuando se usa un tubo para redirigir al tee
.Forzar el almacenamiento en línea de la línea de salida estándar cuando se conecta a la tubería
Tengo un programa C++, a
, que emite cadenas, siempre \n
-terminated, a stdout
.
Cuando se ejecuta solo (./a
), todo se imprime correctamente y en el momento correcto, como se esperaba. Sin embargo, si lo canalizo a tee
(./a | tee output.txt
), no imprime nada hasta que se cierra, lo que anula el propósito de usar tee
.
Sé que podría solucionarlo agregando un fflush(stdout)
después de cada operación de impresión en el programa C++. Pero, ¿hay una manera más limpia y fácil? ¿Hay algún comando que pueda ejecutar, por ejemplo, que obligue a stdout
a ser amortiguado en línea, incluso cuando se usa una tubería?
Gracias, esto funcionó, aunque tuve que compilar ' expect' yo mismo como 'unbuffer' no parece estar incluido por defecto en OS X. – houbysoft
@houbysoft: me alegro de que funcionó para usted. 'unbuffer' es solo un pequeño script, por lo que no debería haber necesitado recompilar todo el paquete. –
Sí, probablemente no, pero './configure && make' tomó aproximadamente 10 segundos y luego acabo de mover' unbuffer' a '/ usr/local/bin' :) – houbysoft