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