Existe uma maneira de redirecionar a saída de um programa e continuar com o stdout?

24

OK. Se eu quisesse redirecionar a saída de um programa para um arquivo, faria algo assim

prog > file

Se eu quisesse redirecionar stdout e stderr para esse arquivo, então eu faria

prog > file 2>&1

Tudo está bem se você quiser que a saída vá para o arquivo. Mas e se você quiser que a saída vá para o arquivo e ainda assim vá para stdout / stderr? Portanto, a saída é salva no arquivo, mas você ainda pode vê-la no console enquanto o programa está sendo executado. Existe uma maneira de fazer isso? E se sim, como?

Jonathan M Davis
fonte
Terminologia: você quer dizer e ainda vai para o terminal . stdouté o descritor de arquivo 1 e foo > some_filesignifica que um descritor de arquivo somente gravação aberto some_fileé o stdout do foo. stdout sempre vai para stdout.
Peter Cordes

Respostas:

39

teeexiste para esse fim; pega um argumento de nome de arquivo e grava os dados que lê de stdin no stdout e no arquivo:

$ prog 2>&1 | tee file
Michael Mrozek
fonte
10
E para extra de festa 4 fofura: prog |& tee file.
Tobu
11
Você também pode substituir 'arquivo' com um tubo chamado ...
Kevin Cantu
@KevinCantu: Um pipe nomeado é apenas um tipo de arquivo; este é o Unix, onde tudo é um arquivo. Você também pode prog |& tee /dev/tty > file, o que pode ser útil no meio de um pipeline, por exemplo, foo |& tee /dev/tty | sed 's/.*\r//' > foo.logpara ver atualizações de progresso da linha de status em seu terminal, mas filtrá-las em um arquivo de log. Ou use-o para depurar um pipeline que você está invadindo em conjunto, permitindo ver os dados naquele momento.
Peter Cordes