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?
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
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
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
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
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..
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.
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.
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"
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
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