GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo redirigir la salida a un archivo y stdout

El comando que desea se llama tee :

foo | tee output.file

Por ejemplo, si solo te importa la salida estándar:

ls -a | tee output.file

Si desea incluir stderr, haga:

program [arguments...] 2>&1 | tee outfile

2>&1 redirige el canal 2 (stderr/error estándar) al canal 1 (stdout/salida estándar), de modo que ambos se escriben como stdout. También se dirige al archivo de salida dado a partir del tee comando.

Además, si desea agregar al archivo de registro, use tee -a como:

program [arguments...] 2>&1 | tee -a outfile

$ program [arguments...] 2>&1 | tee outfile

2>&1 vuelca los flujos stderr y stdout.tee outfile toma el flujo que obtiene y lo escribe en la pantalla y en el archivo "outfile".

Esto es probablemente lo que la mayoría de la gente está buscando. La situación probable es que algún programa o script esté trabajando duro durante mucho tiempo y produciendo muchos resultados. El usuario desea verificar periódicamente el progreso, pero también desea que el resultado se escriba en un archivo.

El problema (especialmente cuando se mezclan flujos stdout y stderr) es que se depende de que el programa vacíe los flujos. Si, por ejemplo, todas las escrituras en stdout son no vaciado, pero todas las escrituras en stderr son vaciados, luego terminarán fuera de orden cronológico en el archivo de salida y en la pantalla.

También es malo si el programa solo genera 1 o 2 líneas cada pocos minutos para informar el progreso. En tal caso, si el programa no vaciara la salida, el usuario ni siquiera vería ninguna salida en la pantalla durante horas, porque nada de eso pasaría por la tubería durante horas.

Actualización:El programa unbuffer , parte del expect paquete, resolverá el problema de almacenamiento en búfer. Esto hará que stdout y stderr escriban en la pantalla y el archivo inmediatamente y los mantendrán sincronizados cuando se combinen y redirijan a tee . Por ejemplo:

$ unbuffer program [arguments...] 2>&1 | tee outfile

Otra forma que funciona para mí es,

<command> |& tee  <outputFile>

como se muestra en el manual de gnu bash

Ejemplo:

ls |& tee files.txt

Si se usa '|&', error estándar de command1 , además de su salida estándar , está conectado a la entrada estándar de command2 a través de la tubería; es abreviatura de 2>&1 |. Esta redirección implícita del error estándar a la salida estándar se realiza después de cualquier redirección especificada por el comando.

Para obtener más información, consulte la redirección


Linux
  1. Cómo redirigir la salida a un archivo y salida estándar en Linux

  2. ¿Cómo redirigir la salida de un programa a un archivo zip?

  3. Salida a Stdout y al mismo tiempo Grep en un archivo?

  4. ¿Qué forma de redirigir la salida de un programa y todavía hacer que vaya a la salida estándar?

  5. ¿Cómo redirigir Stderr y Stdout a diferentes archivos y también mostrarlos en la terminal?

Cómo redirigir stderr a stdout en Bash

Cómo redirigir la salida del comando de shell

¿Cómo redirigir la salida de system() a un archivo?

Redirección de salida de comando a archivo y terminal

Cómo redirigir la salida del programa como su entrada

Captura de STDERR y STDOUT para archivar usando tee