Como o comando tee funciona? [fechadas]

4

Depois de encontrar cerca de 3% detee de explicações que eu considero indiferentes, gostaria de pedir uma explicação simples, geral e escalonada (se possível) sobre esse comando, voltada para os recém-chegados ao Linux.

Eu entendo que o usamos através de um pipe, em um stdout de 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 aqui está o que eu peço, na esperança de encontrar uma explicação didática, serviu para os recém-chegados de uma forma clara e escalonada:

  1. Como o comando funciona com o stdout de um comando ou, alternativamente, com os arquivos em si?

  2. Por que é comum dizer que tee lê entrada padrão? Quero dizer, se eu fizer ls -l , tee não lê a sintaxe ls -l em si, mas sim o stdout impresso na sessão.

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

    
por JohnDoea 29.04.2017 / 12:23

1 resposta

12

Do manual tee no meu sistema:

The tee utility copies standard input to standard output, making a copy in zero or more files. The output is unbuffered.

Então, 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 o copiaria na saída padrão (o terminal), ao mesmo tempo em que copia o arquivo nos arquivos one , two e three :

$ somecommand | tee one two three

tee tem muitos usos, um está em conjunto com sudo para redirecionar a saída para um arquivo de propriedade do root:

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

O seguinte não funcionou, já que o redirecionamento acontece como usuário não privilegiado (ele também executaria 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 vez (para todos os usuários ~/.profile arquivos, assumindo que * se expande para os nomes de usuário e que a linha de comando expandida não se torne muito longa para o shell para lidar com):

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

Um exemplo real de usar tee :

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

Isto é eu construindo o sistema básico do OpenBSD. doas é o OpenBSD "equivalente" de sudo e box-build.sh é um pequeno script de shell que faz o prédio (essencialmente %código%). Eu gostaria de armazenar a saída de todo o processo de criação, incluindo quaisquer erros ou avisos, mas não quero ter tudo expelido no meu terminal. Para este fim eu uso cd /usr/src && make obj && make build para salvar tudo em tee e, em seguida, build.out para obter apenas uma dica de onde no processo estamos no terminal.

Veja também as outras perguntas aqui marcadas com a tag .

    
por 29.04.2017 / 12:45

Tags