Redirecionando stdout para terminal e um arquivo usando tee

Digamos que você esteja interessado em quanto espaço livre em disco há em seu
sistema.

Muito fácil:

iMac:~ $ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk0s2 233Gi 151Gi 82Gi 65% 39657424 21412016 65% /
devfs
204Ki 204Ki 0Bi 100% 704 0 100% /dev
/dev/disk1s2 931Gi 91Gi 840Gi 10% 23782594 220324072 10% /Volumes/Macintosh HD 2
map
-hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net
map auto_home
0Bi 0Bi 0Bi 100% 0 0 100% /home

Mas e se também quisermos salvar esses resultados em um arquivo?

Isso também seria fácil de fazer, apenas redirecionando a saída padrão
(ou seja, stdout) para um arquivo:

iMac:~ $ df -h > df.out

Isso funciona bem, exceto que eu não quero digitar 2 comandos separados.

Na verdade, para alguns exemplos, pode não ser viável executar os comandos
separadamente porque a saída pode ser diferente. O que você precisa é
a capacidade de capturar a saída, enviá-la para a saída padrão (por exemplo, o
terminal) e também salvá-la em um arquivo separado.

Bem, há um comando que o ajudará a fazer exatamente isso – o comando tee.

De acordo com as páginas de manual do UNIX no OS X:
O utilitário tee copia da entrada padrão para a saída padrão, fazendo
uma cópia em zero ou mais arquivos.

Vamos tentar nosso exemplo novamente, mas desta vez usando tee:

iMac:~ $ df -h | tee df.out
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk0s2 233Gi 151Gi 82Gi 65% 39657219 21412221 65% /
devfs
204Ki 204Ki 0Bi 100% 704 0 100% /dev
/dev/disk1s2 931Gi 91Gi 840Gi 10% 23782594 220324072 10% /Volumes/Macintosh HD 2
map
-hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net
map auto_home
0Bi 0Bi 0Bi 100% 0 0 100% /home

Agora, vamos dar uma olhada no conteúdo desse arquivo, apenas para ter certeza de que
as informações do disco foram gravadas lá, além do que vimos na
saída padrão:

iMac:~ $ cat df.out 
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk0s2 233Gi 151Gi 82Gi 65% 39657219 21412221 65% /
devfs
204Ki 204Ki 0Bi 100% 704 0 100% /dev
/dev/disk1s2 931Gi 91Gi 840Gi 10% 23782594 220324072 10% /Volumes/Macintosh HD 2
map
-hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net
map auto_home
0Bi 0Bi 0Bi 100% 0 0 100% /home

A saída é idêntica à que vimos quando executamos o comando original,
que é exatamente o resultado que desejamos.

Portanto, da próxima vez que você precisar ver a saída padrão e também copiá-la para
um arquivo, lembre-se de que o comando tee é uma ótima opção.

Para obter mais dicas sobre UNIX, consulte Learning the UNIX Command Line .