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 ?

18voto

UTF-8 Points 660

tee est loin d'être inutile. Je l'utilise tout le temps et je suis content qu'il existe. C'est un outil très utile si vous avez un pipeline que vous voulez diviser. Un exemple très simple est que vous avez un répertoire $d que vous voulez tar et que vous voulez également hacher parce que vous êtes paranoïaque (comme moi) et que vous ne faites pas confiance au support de stockage pour conserver les données de manière fiable. Vous pouvez consulter le site pourrait l'écrire d'abord sur le disque et ensuite le hacher, mais cela échouerait si l'archive est corrompue avant d'être hachée. De plus, il faudrait la lire et si vous travaillez souvent sur des fichiers de plusieurs centaines de Go, vous saurez que vous n'avez vraiment pas envie de les relire si ce n'est pas nécessaire.

Donc ce que je fais est simplement ceci :

tar -c "$d" | tee >(sha256sum) >(cat > "$d"".tar") > /dev/null

Il crée la boule de tar et la transmet à tee qui la transmet ensuite à deux sous-shells, dans l'un desquels elle est hachée et dans l'autre elle est écrite sur le disque.

Il est également idéal si vous souhaitez effectuer plusieurs opérations sur un fichier volumineux :

< file.tar.gz tee >(sha256sum) >(tar -xz) /other/storage/location/file.tar.gz > /dev/null

Lit le fichier une fois, le hache (afin que vous puissiez vérifier s'il est toujours en ordre), l'extrait et le copie à un autre endroit. Il n'est pas nécessaire de le lire trois fois pour cela.

12voto

studog Points 313

Nitpick sur la réponse de @bertieb qui dit que Cet exemple montre l'utilisation de tee pour contourner une limitation inhérente à la commande sudo. sudo est incapable de canaliser la sortie standard vers un fichier.

Il n'y a pas de limitation inhérente, seulement une mauvaise compréhension de la façon dont la commande est traitée.

Exemple :

sudo echo 0 > /proc/sys/net/ipv4/ip_forward

El courant Shell analyse la ligne de commande. Il trouve la redirection de sortie et l'exécute. Ensuite, il exécute la commande, qui est la commande sudo et fournit le reste de la ligne de commande comme arguments à la commande exécutée. Si le Shell actuel n'a pas les permissions root, alors la redirection de la sortie échouera.

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

Cela fonctionne parce que la redirection de la sortie est reportée à la section tee qui, à ce moment-là, a les droits de root car elle a été exécutée par le biais de la commande sudo .

sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"

Cela fonctionne parce que le Shell qui effectue la redirection a les permissions root.

10voto

Sergey Arenzon Points 11

Comme d'autres personnes l'ont mentionné, il est possible d'envoyer la sortie vers le fichier tee écrit cette sortie à la fois dans un fichier et sur stdout.

J'utilise souvent tee lorsque je veux capturer la sortie d'une commande qui prend beaucoup de temps à s'exécuter, tout en voulant inspecter visuellement la sortie dès que la commande la rend disponible. De cette façon, je n'ai pas besoin d'attendre la fin de l'exécution de la commande pour inspecter la sortie.

Ce qui ne semble pas avoir été mentionné jusqu'à présent (à moins que je ne l'aie manqué), c'est que les tee peut également écrire dans plusieurs fichiers à la fois. Par exemple :

ls *.png | tee a.txt b.txt

va écrire tous les *.png dans le répertoire courant vers deux fichiers différents ( a.txt y b.txt ) en même temps.

En fait, vous pouvez taper du texte dans plusieurs fichiers différents à la fois avec tee comme ça :

$ tee --append a.txt b.txt c.txt d.txt
These lines are appended to four different files,
and are also written to stdout.
CTRL-D

9voto

Wil Young Points 91

L'utilisation la plus courante de tee est de voir le texte sur le terminal en même temps que vous l'envoyez au fichier (ou aux fichiers). La formulation de votre question suppose que vous n'écrivez jamais que du texte dans les fichiers journaux. J'ai des scripts qui écrivent des listes de noms de fichiers ou de répertoires dans des fichiers déclencheurs (pour être traités par d'autres scripts de manière asynchrone) et j'utilise tee pour envoyer le même contenu à stdout. Tous les stdout sont dirigés vers les logs. Ainsi, j'ai mon texte là où je le veux et j'ai une entrée de journal enregistrant que j'ai fait cela, tout cela à partir d'une seule instruction 'echo'.

tee est également la meilleure méthode sous Unix pour créer plusieurs fichiers identiques. Je l'utilise occasionnellement pour créer plusieurs fichiers vides, comme ceci ...

:|tee file01 file02 file03

1voto

domih Points 125

Imaginons que vous vouliez écrire la sortie d'une commande dans un fichier journal. ET s'imprimer sur stdout. Si vous avez besoin de le faire en même temps, alors vous devez tee .

Un cas d'utilisation est d'avoir des scripts de construction qui écrivent toute la construction à stdout (par exemple pour Jenkins) mais des choses importantes en même temps à un fichier journal séparé (pour les emails de résumé).

Vous allez vraiment commencer à regretter tee quand vous devez script dans Windows. Il n'y a pas de tee et c'est vraiment ennuyeux.

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