Não há diferença no sentido de que os dados no arquivo serão os mesmos se echo
e tee
forem executados com sucesso e se o arquivo for gravável pelo usuário atual.
O comando tee
produziria adicionalmente a saída na saída padrão its , mostrando o texto que também seria anexado ao arquivo. Isso não aconteceria no primeiro comando.
Outra diferença é que, se o arquivo puder ser não gravado, o primeiro comando, com o redirecionamento, nem mesmo executaria o echo
, enquanto o echo
executado no segundo comando, mas tee
falharia ao escrever no arquivo ( tee
ainda produziria texto no terminal).
Isso pode ser significativo no caso em que você executa algum processo de execução longa que produz saída:
long_running_thing >>file
Isso nem sequer iniciaria long_running_thing
se file
não fosse gravável.
long_running_thing | tee -a file
Isso executaria long_running_thing
e seria executado até o final, mas nenhuma saída seria salva em file
se não fosse gravável (e a saída também seria gravada no terminal a partir de tee
).
A próxima coisa a ter em conta, que você sugeriu no final da pergunta, é que
sudo echo hello >>file
não funcionará se file
não for gravável pelo usuário atual . Isso ocorre porque o redirecionamento é processado antes do comando ser executado (veja acima).
Para anexar a um arquivo de propriedade da raiz, use
echo hello | sudo tee -a file
Aqui, executamos tee
como root. O echo
não precisa ser executado pelo root, mas o utilitário que realmente grava no arquivo precisa ser executado como root (ou como qualquer usuário que possua o arquivo) se não for de propriedade do usuário atual.
Outra possibilidade seria usar
sudo sh -c 'echo hello >>file'
Isso usaria um redirecionamento para anexar dados ao arquivo, mas, nesse caso, o shell que executa o redirecionamento está sendo executado como raiz, portanto, ele não falharia ao anexar / criar o arquivo devido a permissões / propriedade restritivas pode ainda falhar se, por exemplo, file
é o nome de um diretório).