$ program [arguments...] 2>&1 | tee outfile
2>&1
despeja os fluxos stderr e stdout.
tee outfile
pega o fluxo que obtém e grava na tela e no arquivo "outfile".
Provavelmente é isso que a maioria das pessoas está procurando. A situação provável é que algum programa ou script esteja trabalhando duro por um longo tempo e produzindo muita saída. O usuário deseja verificar periodicamente o progresso, mas também deseja que a saída seja gravada em um arquivo.
O problema (especialmente ao misturar fluxos stdout e stderr) é que existe confiança nos fluxos sendo liberados pelo programa. Se, por exemplo, todas as gravações no stdout não forem liberadas, mas todas as gravações no stderr forem liberadas, elas acabarão fora de ordem cronológica no arquivo de saída e na tela.
Também é ruim se o programa emitir apenas 1 ou 2 linhas a cada poucos minutos para relatar o progresso. Nesse caso, se a saída não fosse liberada pelo programa, o usuário nem veria nenhuma saída na tela por horas, porque nada disso seria empurrado pelo cano por horas.
Atualização: O programa unbuffer
, parte do expect
pacote, resolverá o problema do buffer. Isso fará com que stdout e stderr gravem na tela e no arquivo imediatamente e os mantenham sincronizados ao serem combinados e redirecionados para tee
. Por exemplo:
$ unbuffer program [arguments...] 2>&1 | tee outfile