105 votes

Quel est le but du "tee" ?

Tous les usages de tee que j'ai jamais vu étaient tels :

 do_something | tee -a logfile

Ou :

do_something_else | tee logfile

Est tee inventé pour ceux qui ne le savent pas, vous pouvez faire la même chose avec les redirections de tuyaux Shell ? Par exemple :

do_something >> logfile

Ou :

do_something_else > logfile

C'est pratiquement la même chose et il faut moins de frappes au clavier pour le faire. Quelles sont les fonctionnalités cachées que je ne vois pas dans tee ?

254voto

Eugen Rieck Points 19064

Ce que vous ne voyez pas, c'est que do_something | tee -a logfile met la sortie dans logfile y vers stdout, tandis que do_something >> logfile le met sólo dans le fichier journal.

Le but de tee est de produire un scénario à une entrée et à plusieurs sorties, comme dans un croisement en "T".

EDIT

Il y a eu des commentaires sur la façon dont tee permet une utilisation plus harmonieuse de sudo . Cela n'a rien à voir avec le sujet : cat , dd ou peut-être mieux buffer offrent cette possibilité avec de meilleures performances, si vous n'avez pas besoin des sorties multiples. Utilisez tee pour ce qu'il est conçu, et non pour ce qu'il "peut aussi faire".

123voto

bertieb Points 6989

Tee n'est pas inutile

Peut-être que tu le savais de toute façon ? Si non, continuez à lire ! Ou si vous savez comment cela fonctionne, mais que vous n'êtes pas sûrs pourquoi il existe, passez à la fin pour voir comment il s'intègre dans la philosophie Unix.

Quoi est l'objectif de tee ?

Dans sa forme la plus simple, il prend des données sur l'entrée standard et les écrit sur la sortie standard et dans un (ou plusieurs) fichiers. Il a été comparé à un Té de plomberie dans la façon dont il divise une entrée en deux sorties (et deux directions).

Exemples

Prenons votre premier exemple :

do_something | tee -a logfile

Cela prend la sortie de do_something et l'ajoute au fichier journal, tout en l'affichant à l'utilisateur. En fait, le Page Wikipedia sur tee est le deuxième exemple :

Pour visualiser et ajouter la sortie d'une commande à un fichier existant :

  lint program.c | tee -a program.lint

Cela affiche la sortie standard de la commande lint program.c sur l'ordinateur et ajoute en même temps une copie de celle-ci à la fin du fichier program.lint. Si le fichier program.lint n'existe pas, il est créé.

L'exemple suivant a une autre utilité : escalade des permissions :

Pour permettre l'escalade des permissions :

cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"

Cet exemple montre l'utilisation de tee pour contourner une limitation inhérente à l'outil de gestion des déchets. sudo commandement. sudo est incapable d'envoyer la sortie standard vers un fichier. En vidant son flux de sortie standard dans /dev/null nous supprimons également la sortie en miroir dans la console. La commande ci-dessus donne à l'utilisateur actuel un accès root à un serveur via ssh, en installant la clé publique de l'utilisateur dans la liste d'autorisation de clés du serveur.

Ou peut-être voulez-vous prendre la sortie d'une commande, l'écrire quelque part et l'utiliser comme entrée d'une autre commande ?

Vous pouvez également utiliser la commande tee pour stocker la sortie d'une commande dans un fichier et rediriger cette même sortie comme entrée d'une autre commande.

La commande suivante prendra une sauvegarde des entrées de la crontab, et passera les entrées de la crontab comme entrée à la commande sed qui fera la substitution. Après la substitution, elle sera ajoutée comme une nouvelle tâche cron.

$ crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab –

(crédit à Exemples d'utilisation de la commande Tee )

Tee fonctionne avec la philosophie Unix :

Écrire des programmes qui font une seule chose et qui la font bien. Écrivez des programmes qui travaillent ensemble. Écrire des programmes pour gérer des flux de texte, car il s'agit d'une interface universelle.

(Crédit à Les bases de la philosophie Unix )

tee correspond à tout cela :

  • il fait une chose : il crée une copie supplémentaire de l'entrée
  • il fonctionne avec d'autres programmes parce qu'il est la colle (ou une pièce de plomberie en "T" si vous préférez) qui permet aux autres programmes de fonctionner ensemble comme dans les exemples ci-dessus.
  • il le fait en manipulant un flux de texte donné sur l'entrée standard

72voto

Attie Points 18031

C'est pratiquement la même chose et il faut moins de frappes au clavier pour le faire.

Ce n'est pas du tout la même chose...

Les éléments suivants semblent être quelque peu équivalents, mais ils ne le sont pas :

$ echo "hi" > test.txt

$ echo "hi" | tee test.txt
hi

La différence essentielle est que le premier a écrit les données uniquement dans le fichier nommé, alors que le second a écrit hi au terminal ( stdout ) y le fichier nommé, comme indiqué ci-dessous :

redirect vs tee


tee permet d'écrire les données dans un fichier y l'utiliser dans un pipeline en aval, ce qui vous permet de faire des choses utiles, comme conserver des données à mi-chemin dans un pipeline :

grep '^look ' interesting_file.txt \
  | tee interesting_lines.txt \
  | sort

Ou bien, vous pouvez écrire dans un fichier avec des privilèges élevés, sans donner à l'ensemble du pipeline des privilèges élevés (ici echo et le Shell sont exécutés en tant qu'utilisateur, alors que tee écrit dans le fichier en tant que root ):

echo 0 \
  | sudo tee /proc/sys/net/ipv4/ip_forward

Con tee vous pouvez écrire dans plusieurs fichiers ( y stdout ):

echo "hi" \
  | tee a.txt b.txt

Il est également possible d'utiliser exec con tee pour enregistrer toute la sortie d'un script dans un fichier, tout en permettant à un observateur ( stdout ) pour voir les données :

exec > >( tee output.log )

29voto

voices Points 2501

C'est un tee-shirt :
enter image description here

Un raccord de tuyau en forme de T. Il comporte une entrée et deux sorties séparées.
En d'autres termes, il divise un tuyau en deux, comme une fourche sur la route.

De même, tee est un tuyau ( | ) qui vous permet de rediriger votre entrée standard vers deux sorties distinctes.


Exemple
Disons que, par exemple, vous tapez ls / .
Vous obtiendrez une sortie qui ressemble à quelque chose comme :

Applications    Network     Users       bin        dev      net      private    tmp         var
Library         System      Volumes     cores      etc      home     opt        sbin        usr

Rediriger la sortie vers un fichier texte, ls / > ls.txt et aucune sortie n'est affichée dans le Shell, seulement dans le fichier texte résultant.

Vous voulez voir la sortie, ET la passer à un fichier texte en même temps ?
Ajouter un tee à votre tuyau ( | ) c'est-à-dire : ls / | tee ls.txt


Comparez les deux :

ls /          >          ls.txt
ls /        | tee        ls.txt

18voto

LPChip Points 53736

Non. Vous mentionnez un des rares exemples où vous pourriez effectivement rediriger vers le fichier en utilisant > y >> opérateurs.

Mais Tee peut faire beaucoup plus. Parce que vous y accédez, vous pouvez ensuite accéder à autre chose.

Un bon exemple est répertorié sur le site page wikipédia :

find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt

En gros, vous pouvez raccorder un tuyau à un T, pour pouvoir ensuite raccorder le T à autre chose. Si tout ce que vous voulez faire est d'écrire un fichier journal, oui, alors vous n'avez pas vraiment besoin de Tee.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X