Cómo redirigir la salida a un archivo y salida estándar


En bash, llamar a foo mostraría cualquier salida de ese comando en la salida estándar.

Llamar a foo > output redirigiría cualquier salida de ese comando al archivo especificado (en este caso 'output').

¿Hay una manera de redirigir la salida a un archivo y que se muestre en stdout?

Author: Mike, 2009-01-07

9 answers

El comando que desea es llamado 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 (error stderr/standard) al canal 1 (salida stdout / standard), de modo que ambos se escriben como salida stdout. También se dirige al archivo de salida dado a partir del comando tee.

Además, si desea añadir al archivo de registro, utilice tee -a as:

program [arguments...] 2>&1 | tee -a outfile
 923
Author: Zoredache,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-23 17:10:56
$ program [arguments...] 2>&1 | tee outfile

2>&1 vuelca los flujos stderr y stdout. tee outfile toma la secuencia que recibe y la 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 una gran cantidad de salida. El usuario quiere comprobar periódicamente el progreso, pero también quiere que la salida se escriba en un archivo.

El problema (especialmente cuando se mezclan flujos stdout y stderr) es que hay dependencia en las corrientes que son descargadas por el programa. Si, por ejemplo, todas las escrituras en stdout están no descargadas, pero todas las escrituras en stderr están descargadas, entonces 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 reportar el progreso. En tal caso, si la salida no estaba enrojecida por el programa, el usuario no ve ninguna salida en la pantalla para horas, porque nada de eso sería empujado a través de la tubería durante horas.

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

$ unbuffer program [arguments...] 2>&1 | tee outfile
 443
Author: Matthew Alpert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 03:58:03

Otra manera que funciona para mí es,

<command> |& tee  <outputFile>

Como se muestra en gnu bash manual

Ejemplo:

ls |& tee files.txt

Si se usa'/&', el 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 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 redirección

 93
Author: tsenapathy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-18 23:54:29

Puedes usar principalmente Zoredache solución , pero si no desea sobrescribir el archivo de salida, debe escribir tee con la opción-a de la siguiente manera:

ls -lR / | tee -a output.file
 16
Author: O.Badr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:45

Algo que añadir ...

El paquete unbuffer tiene problemas de soporte con algunos paquetes bajo versiones unix de fedora y redhat.

Dejando de lado los problemas

Siguiente trabajó para mí

bash myscript.sh 2>&1 | tee output.log

Gracias ScDF & matthew tus aportes me ahorraron mucho tiempo..

 9
Author: nitinr708,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:30

Usando tail -f output debería funcionar.

 6
Author: Chuck Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-14 15:43:58

Respuesta adicional desde que este caso de uso me trajo aquí:

En el caso de que necesite hacer esto como algún otro usuario

echo "some output" | sudo -u some_user tee /some/path/some_file

Tenga en cuenta que el echo sucederá como usted y la escritura del archivo sucederá como "some_user" lo que NO funcionará es si ejecuta el echo como "some_user" y redirige la salida con >> "some_file" porque el redireccionamiento del archivo sucederá como usted.

Sugerencia: tee también admite agregar con la bandera-a, si necesita reemplazar una línea en un archivo como otro usuario que podría ejecutar sed como el usuario deseado.

 3
Author: jorfus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-20 16:29:20

< command > |& tee filename # esto creará un archivo "filename" con el estado del comando como un contenido, si un archivo ya existe, eliminará el contenido existente y escribirá el estado del comando.

< command > | tee >> filename # esto añadirá estado al archivo pero no imprime el estado del comando en standard_output (screen).

Quiero imprimir algo usando "echo" en la pantalla y agregar esos datos a un archivo

echo "hi there, Have to print this on screen and append to a file" 
 0
Author: kiran sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 16:26:40

Tee es perfecto para esto, pero esto también hará el trabajo

ls -lr / > output | cat output
 -10
Author: kal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-19 10:41:57