
Depois de encontrar cerca de 3 tee
explicaçõ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:
Como o comando funciona com o stdout de um comando ou, alternativamente, com os próprios arquivos?
Por que é comum dizer que
tee
lê a entrada padrão? Quero dizer, se eu fizer issols -l
,tee
não lerá a sintaxels -l
em 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 tee
manual 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, tee
pegaria 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 one
e :two
three
$ somecommand | tee one two three
tee
tem muitos usos, um deles é em conjunto com sudo
o 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 somecommand
como 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 ~/.profile
arquivos 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 desudo
e 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 tee
salvar tudo build.out
e grep
apenas obter uma dica de onde estamos no processo no terminal.
Veja também as outras perguntas aqui que estão marcadas com ocamisetamarcação.