Existe algum significado para usar o tee?

47

Por que quase todas as instruções relacionadas à anexação de texto aos arquivos do sistema, como fstabe /etc/apt/sources.list.d/<name>.listenvolvem o uso tee e echo a adição do referido texto?

Veja os seguintes exemplos, que são executados como raiz :

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

Correr diff -u file1 file2não retorna nada; A execução md5sum file1 file2mostra que as somas de verificação são idênticas, o que me traz de volta à minha pergunta original:

Por que é | tee <FILENAME>tão prevalecente nos documentos do Ubuntu, é apenas uma boa prática, caso contrário não seria mais fácil usar o exemplo 2 em vez de passar a saída de echopara tee?

Alexej Magura
fonte
1
Está faltando sudo em seus comandos; que mostrará resultados diferentes entre os 2;)
Rinzwind
1
@Rinzwind Estou executando esses comandos como root.
precisa saber é o seguinte

Respostas:

84

Há uma diferença: tee duplica a saída: envia-a para o arquivo e para a tela.

Mas há mais:

  • Por exemplo, se você deseja gravar alguma sequência em dois arquivos ao mesmo tempo, o comando com tee que você pode usar é:

     echo "some text" | tee file1 > file2  
    
  • Outra coisa que o tee pode ajudar é evitar um problema ao usar o sudo. O operador de redirecionamento de saída normal é sempre executado com seus privilégios de usuário, também quando você escreve um sudo na frente do comando que gera o texto STDOUT. Em outras palavras, isso falhará se você não tiver permissão para gravar nesse arquivo:

     sudo echo "something" > bar  
    

    Mas com o tee tudo vai dar certo:

    echo "something" | sudo tee bar  
    

2 exemplos deste site . Tem um pouco mais.

Rinzwind
fonte
Você pode sudosem tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf
7
@wilf sim, mas quando você precisa citações de saída ", as coisas torna-se confuso
Braiam
3
No primeiro caso, se você deseja gravar em arquivos N, eu preferiria echo "some text" | tee file1 file2 ... fileNe talvez acrescentaria > /dev/null, se você não quiser desordem no stdout.
Elmar Zander
Um @ElmarZander bom :)
Rinzwind
13

teepega o fluxo de entrada padrão e grava- o no fluxo de saída padrão e também em um fluxo de arquivos. Se isso ajuda as pessoas a se lembrarem, o nome do comando vem de um divisor em T no encanamento. Há um bom artigo da Wikipedia onde eu aprendi sobre a origem do nome do comando.

insira a descrição da imagem aqui insira a descrição da imagem aqui

user391339
fonte
11

Primeiro de tudo, teeele próprio não anexa texto, nem o faz >.

É tee -ae seu complemento >>que APENDE o texto.

Eu não acredito que todos os shells suportem a >>função, por isso teeé mais comumente usado. (Pense apenas na idade antiga sh). Tee é um comando, enquanto >>é um operador.

Se você usa (meu favorito) bash, >e >>é muito melhor / mais fácil.

Usar teetambém permite que você sudo APENAS esse comando, para que você não precise sudo toda a instrução, como em sudo sh -c "echo foo > bar". teetambém permite dividir a saída. Claro, tudo isso pode ser visto em man tee. É principalmente apenas a sua preferência pessoal.

Para ler mais, veja aqui e aqui .

Kaz Wolfe
fonte
5
Esclarecimento sobre "sudo só que comando", para qualquer um encontrar este um pouco complexo: usando um formulário como sudo somecommand >> fileaserá executado sudo somecommande, em seguida, como a invocação do usuário, anexar a saída filea. Usando sudo sh -c "somecommand >> filea"obras, mas pode causar pesadelos com citações aninhadas. O uso somecommand | sudo tee -a fileaé executado somecommandcomo usuário que está chamando e, em seguida, anexa a saída fileacomo raiz - o que geralmente é o que o usuário queria.
Darael
@Darael eu editei o post. Obrigado por fazer o esclarecimento.
Kaz Wolfe