Como funciona o comando tee?

Como funciona o comando tee?

Depois de encontrar cerca de 3 teeexplicações que considero pouco didáticas, gostaria de pedir uma explicação simples, geral e passo a passo (se possível) sobre este comando, voltado para iniciantes no Linux.

Entendo que o usamos por meio de um canal, no stdout de um comando ou, alternativamente, diretamente em um determinado arquivo, mas acho que sinto falta do que o comando realmente faz com esse conteúdo e quando é útil.

Então eis o que pergunto, na esperança de encontrar uma explicação didática, servida aos recém-chegados de forma clara e escalonada:

  1. Como o comando funciona com o stdout de um comando ou, alternativamente, com os próprios arquivos?

  2. Por que é comum dizer que teelê a entrada padrão? Quero dizer, se eu fizer isso ls -l, teenão lerá a sintaxe ls -lem si, mas sim o stdout impresso na sessão.

Além disso, se desejar, compartilhe um exemplo prático de seu trabalho diário sobre quando teeé muito útil para você.

Responder1

Do teemanual do meu sistema:

O utilitário tee copia a entrada padrão para a saída padrão, fazendo uma cópia em zero ou mais arquivos. A saída não é armazenada em buffer.

Assim, ele lê a entrada padrão e a copia para a saída padrão e, ao fazer isso, também duplica o fluxo em um ou vários arquivos.

No pipeline a seguir, teepegaria a saída do primeiro comando no pipeline e a copiaria para a saída padrão (o terminal), ao mesmo tempo que faria cópias dela nos arquivos onee :twothree

$ somecommand | tee one two three

teetem muitos usos, um deles é em conjunto com sudoo redirecionamento da saída para um arquivo de propriedade do root:

$ somecommand | sudo tee /root/somefile >/dev/null

O seguinte serianãofuncionou, pois o redirecionamento acontece como usuário sem privilégios (também seria executado somecommandcomo root, o que pode ser indesejado):

$ sudo somecommand >/root/somefile

Um exemplo artificial de anexar um conjunto fixo de linhas a muitos arquivos de uma só vez (para todos os ~/.profilearquivos de usuários, assumindo que *se expande para os nomes de usuário e que a linha de comando expandida não se torna muito longa para o shell manipular):

$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH

Um exemplo real de uso tee:

time doas box-build.sh 2>&1 | tee build.out |  grep '^=*>'

Sou eu construindo o sistema básico do OpenBSD. doaséo "equivalente" do OpenBSD desudoe box-build.shé um pequeno script de shell que faz a construção (essencialmente cd /usr/src && make obj && make build). Gostaria de armazenar a saída de todo o processo de construção, incluindo erros ou avisos, mas não quero que tudo seja vomitado em meu terminal. Para esse fim, costumo teesalvar tudo build.oute grepapenas obter uma dica de onde estamos no processo no terminal.

Veja também as outras perguntas aqui que estão marcadas com omarcação.

informação relacionada