$ program [arguments...] 2>&1 | tee outfile
2>&1
vuelca las secuencias stderr y stdout.
tee outfile
toma la transmisión que recibe y la escribe en la pantalla y en el archivo "archivo externo".
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 resultados. El usuario quiere verificar 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 el programa confía en que los flujos se descarguen. Si, por ejemplo, todas las escrituras en stdout no están enjuagadas, pero todas las escrituras en stderr están enjuagadas, entonces terminarán sin 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 descargara la salida, el usuario ni siquiera vería ninguna salida en la pantalla durante horas, ya que ninguna de ellas 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 mantengan sincronizados cuando se combinen y se redirijan a ellos tee
. P.ej:
$ unbuffer program [arguments...] 2>&1 | tee outfile