Y a-t-il une signification à utiliser le tee?

47

Pourquoi est - ce que presque toutes les instructions concernant l' ajout de texte aux fichiers système comme fstabet /etc/apt/sources.list.d/<name>.listimpliquer l' utilisation tee et echo à ajouter du texte dit?

Prenez les exemples suivants, qui sont exécutés en tant que root :

## 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

Courir diff -u file1 file2ne renvoie rien; en cours d'exécution md5sum file1 file2montre leurs sommes de contrôle sont identiques, ce qui me ramène à ma question initiale:

Pourquoi la | tee <FILENAME>prévalence est-elle si répandue dans la documentation Ubuntu? S'agit-il d'une bonne pratique? Autrement, ne serait-il pas plus simple d'utiliser simplement l'exemple 2 au lieu de transmettre le résultat echoà tee?

Alexej Magura
la source
1
Vous manquez de sudo dans vos commandes; qui montrera des résultats différents entre les 2;)
Rinzwind
1
@Rinzwind J'exécute ces commandes en tant que root.
Alexej Magura

Réponses:

84

Il y a une différence: tee duplique le résultat: il l'envoie à la fois au fichier et à l'écran.

Mais il y a plus:

  • Par exemple, si vous voulez écrire une chaîne dans deux fichiers à la fois, la commande avec tee que vous pouvez utiliser est la suivante:

     echo "some text" | tee file1 > file2  
    
  • Une autre chose qui peut vous aider est d’éviter un problème lors de l’utilisation de sudo. L'opérateur de redirection de sortie normal est toujours exécuté avec vos privilèges utilisateur, même lorsque vous écrivez un sudo devant la commande qui génère le texte STDOUT. En d'autres termes, cela échouera si vous n'avez pas la permission d'écrire dans ce fichier:

     sudo echo "something" > bar  
    

    Mais avec le tee, tout ira bien:

    echo "something" | sudo tee bar  
    

2 exemples de ce site . Il y en a plus.

Rinzwind
la source
Vous pouvez sudosans tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf
7
@wilf ouais, mais quand vous avez besoin de sortir des guillemets ", tout devient brouillon
Braiam
3
Dans le premier cas, si vous voulez écrire dans N fichiers, je préférerais echo "some text" | tee file1 file2 ... fileNet > /dev/nulléventuellement ajouter , si vous ne voulez pas de fouillis sur la sortie standard.
Elmar Zander
Nice one @ElmarZander :)
Rinzwind
13

teeprend le flux d'entrée standard et l'écrit à la fois dans le flux de sortie standard et dans un flux de fichiers. Si cela aide les gens à se souvenir, le nom de la commande provient d'un séparateur en T de la plomberie. Il y a un bon article sur Wikipedia où j'ai appris l'origine du nom de la commande.

entrez la description de l'image ici entrez la description de l'image ici

utilisateur391339
la source
11

Tout d’abord, teeelle-même n’ajoute pas de texte, pas plus >.

C'est tee -aet son complément, >>que le texte est annexé.

Je ne crois pas que tous les obus prennent en charge la >>fonction, c'est pourquoi teeon l'utilise plus couramment. (Pensez à tout simplement vieux sh). Tee est une commande, tandis que >>est un opérateur.

Si vous utilisez (mon préféré) bash, >et >>sont beaucoup plus gentil / facile.

Utiliser teevous permet également de lancer JUSTE cette commande afin de ne pas avoir à exécuter la totalité de la déclaration, comme dans sudo sh -c "echo foo > bar". teevous permet également de scinder la sortie. Bien sûr, tout cela peut être vu dans man tee. C'est principalement juste votre préférence personnelle.

Pour plus de lecture, voir ici et ici .

Kaz Wolfe
la source
5
Précision sur la commande « sudo juste que la commande », pour toute personne qui trouve cela un peu complexe: en utilisant une forme comme sudo somecommand >> filease déroulera sudo somecommandpuis, comme l' invocation utilisateur, append la sortie filea. Utiliser des sudo sh -c "somecommand >> filea"œuvres, mais peut causer des cauchemars imbriqués. Utilisation somecommand | sudo tee -a fileas’exécute en somecommandtant qu’utilisateur invoquant, puis ajoute le résultat en fileatant qu’utilisateur root - ce qui correspond généralement à ce que l’utilisateur souhaitait.
Darael
@Darael J'ai édité le post. Merci d'avoir apporté cette clarification.
Kaz Wolfe