Escribí un programa (en Ruby) y funcionó bien. Imprime unas pocas líneas de texto y luego se detiene por un minuto y luego repite lo anterior.
Funciona bien (en la terminal de Mac OS X), pero noté que si quería mantener un registro de la salida, usando
ruby myscript.rb | tee record.txt
entonces la salida no se mostrará en la pantalla, hasta que la salida alcance una cierta cantidad, tal vez unos pocos kb. Sin embargo, esto podría significar 5 o 10 minutos sin nada en la pantalla (y tampoco nada en el archivo si presiono CTRL-C).
Podría modificar el programa para vaciar la salida, pero pensé que una aplicación debería ser independiente de lo que se usa con la salida a STDOUT. También puede tee
se puede hacer que funcione bien (quizás con una opción), o se podría usar cualquier otro comando, o tal vez sea una opción de Bash o la aplicación Terminal. ¿Hay alguna manera?
Respuesta aceptada:
Pensé que una aplicación debería ser independiente de lo que se usa con la salida a STDOUT.
Pensaste mal. Las bibliotecas de tiempo de ejecución de varios lenguajes de programación, incluidos los lenguajes C y C++, comparten la semántica de cambiar el almacenamiento en búfer según detecten que la transmisión está conectada a un dispositivo terminal.
Esta es una parte definida del lenguaje en muchos casos. El estándar del lenguaje C dice, por ejemplo:
Tal como se abrió inicialmente, el flujo de error estándar no está totalmente almacenado en el búfer; los flujos de entrada y salida estándar están completamente almacenados en búfer si y solo si se puede determinar que el flujo no hace referencia a un dispositivo interactivo.
La opción habitual si un flujo no está conectado a un dispositivo terminal es seleccionar el almacenamiento en búfer de unidad, el almacenamiento en búfer de línea o el almacenamiento en búfer completo. El almacenamiento en búfer de unidad y el almacenamiento en búfer de línea son habituales para el error estándar; almacenamiento en búfer completo para la salida estándar. Pero esto varía según el idioma.
Entonces, para que la salida no esté completamente almacenada en búfer cuando el flujo de salida es una tubería en tales idiomas, debe
- escriba su programa en sí mismo, cree una línea de salida estándar con búfer, con búfer inteligente o sin búfer;
- use elementos que conecten con la biblioteca de tiempo de ejecución de su lenguaje de programación en particular, como
stdbuf
comando si su lenguaje de programación es C o utiliza (los flujos de E/S forman parte de) la biblioteca de tiempo de ejecución de C como base (algo que no hacen algunos lenguajes de programación); o - usar herramientas como
ptybandage
que hacen que el programa piense que su salida estándar es una terminal, mientras toma esa salida y la envía al extremo de escritura de la canalización.
Lecturas adicionales
- https://unix.stackexchange.com/a/249801/5132