GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer que cualquier programa funcione con el comando Tee?

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.
Relacionado:¿Cómo decide un programa si tiene o no una salida en color?

Lecturas adicionales

  • https://unix.stackexchange.com/a/249801/5132

Linux
  1. Cómo auditar permisos con el comando de búsqueda

  2. ¿Cómo funciona el comando Exit en una terminal Unix?

  3. ¿Cómo funciona el comando 'ls' en Linux/Unix?

  4. ¿Cómo funcionan las opciones '-s', '-t' y '-c' del comando tr en Unix?

  5. ¿Cómo funciona el comando ps?

Cómo usar el comando de suspensión de Linux con ejemplos

Cómo usar el comando tee de Linux

Cómo usar el comando who en Linux con ejemplos

Cómo usar el comando RPM (con ejemplos)

8 Comando Tee de Linux con ejemplos

Cómo encontrar archivos con el comando fd en Linux