Tous les usages de ce que tee
j'ai jamais vu étaient tels:
do_something | tee -a logfile
Ou:
do_something_else | tee logfile
Est-ce tee
inventé pour ceux qui ne savent pas que vous pouvez faire la même chose avec les redirections de pipes? Tel que:
do_something >> logfile
Ou:
do_something_else > logfile
C'est pratiquement la même chose et il faut moins de frappes au clavier pour taper. Quelles sont les fonctionnalités cachées que je ne vois pas tee
?
tee
et la redirection d' E / S ? Le fait qu'il soit indiqué « redirection de canal de passe tel que et » n'est pas un argument en sa faveur, et constitue un argument en faveur de la fermeture, qui n'est pas clair. Mais il pose en fait plusieurs questions: «Quel est le but de ?", "Est inventé pour ceux qui ne savent pas que vous pouvez faire la même chose avec les redirections de tubes de passe ?" Au moins deux de ces questions sont trop larges.>
>>
tee
tee
tee
Réponses:
Ce que vous ne voyez pas que
do_something | tee -a logfile
met la sortie danslogfile
et à la sortie standard, tout ledo_something >> logfile
met seulement dans le fichier journal.Le but de
tee
est de produire un scénario à une entrée, plusieurs sorties - comme dans un croisement en "T".MODIFIER
Il y a eu des commentaires sur la façon dont
tee
permet une utilisation plus facilesudo
. Ceci est à côté du point:cat
,dd
ou peut - être mieuxbuffer
fournir cette possibilité avec de meilleures performances, si vous n'avez pas besoin les multiples sorties. Utiliseztee
pour ce qu'il est conçu, pas pour ce qu'il "peut aussi faire"la source
tee
peut même prendre plusieurs arguments et écrire dans plusieurs fichiers à la fois.cat
de manière simple au lieu detee
par exempleecho /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern
?echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern
ne fonctionne pas, car la redirection est traitée par le shell non-sudo. En ce qui concernedd
,echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_pattern
fonctionne, maisdd
est souvent un outil surpuissant capable de faire de grands dommages, en particulier soussudo
. Quant àbuffer
, ce n’est installé par défaut dans aucune des distributions basées sur RedHat ou Ubuntu que j’ai sous la main (ou MacOS) ...cat
ni/bin/cat
travailler pour moi dans cette situation. Peu importe d’où que cecat
soit: la>
coque sera toujours traitée par le shell de niveau supérieur (non sudo). L'avantage detee
overcat
dans cette situation est qu'elle permet au fichier de sortie d'être transmis en tant que paramètre en ligne de commande (et non en tant que redirection).dd
est certainement une option viable, mais je serais toujours en faveurtee
de celacat
ettee
comme éléments intégrés? Et quelle version desudo
can run shell builtins peut être exécutée?Tee
n'est pas inutilePeut-être que tu le savais quand même? Si non, lisez la suite! Ou si vous savez comment ça marche, mais vous ne savez pas pourquoi, il faut aller à la fin pour voir comment cela s’inscrit dans la philosophie Unix.
Quel est le but de
tee
?Dans sa forme la plus simple, il prend des données sur une entrée standard et les écrit sur une sortie standard et sur un (ou plusieurs) fichier (s). Il a été comparé à un té de plomberie en divisant une entrée en deux sorties (et deux directions).
Exemples
Prenons votre premier exemple:
Cela prend la sortie de
do_something
et l'ajoute au fichier journal, tout en l'affichant à l'utilisateur. En fait, la page Wikipediatee
présente le deuxième exemple:L'exemple suivant a une autre utilisation: escalade des autorisations :
Ou peut-être souhaitez-vous prendre le résultat d'une commande, l'écrire quelque part et l'utiliser également comme entrée d'une autre commande?
(crédit aux exemples d’utilisation de la commande Tee )
Tee
travaille avec la philosophie Unix:(Crédit aux principes de base de la philosophie Unix )
tee
s'adapte à tous ceux-ci:la source
sudo tee -a
est probablement une innovation plus récente (je l'avais d'abord vu dans les guides / wikis Ubuntu, en particulier pour configurer des éléments/proc/sys
, car le passage à Ubuntu était lorsque je suis passé sur unsudo
système de base (comment Ubuntu est configuré par défaut) au lieu d'utilisersu
un mot de passe root). Je pensetee
avantsudo
, donc ce n'est pas une raison pourtee
exister. Vous n’avez pas besointee
de ça, c’est simplement plus court que de taper de manière interactivesudo sh -c 'cat > output'
.tee
alimenter deux pipelines, par exemplefoo | tee >(pipe2) | pipe1
. Ou encore, amusez-vousffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.log
à voir les mises à jour des lignes de statut de manière interactive sur le terminal, tout en supprimant les "lignes" qui se terminent par chariot-return au lieu de newline pour la journalisation réelle. (ie filtrer les mises à jour de la ligne d'état). En général, vous pouvez coller untee /dev/tty
emplacement quelconque dans un pipeline en tant qu'impression de débogage.>
et met en place la redirection avant même obtenir sudoexec
« d, il est donc certainement pas une limitation de sudo qu'il ne gère pas les choses qu'il ne voit jamais. :) J'essaie généralement de parler de "flux de travail sudo" ou d'un terme similaire lorsque je l'explique, plutôt que de décrire sudo lui-même.sudo tee -a
IMHO est un abus de tee. Utilisezsudo cat
,sudo dd
ou (avec les meilleures performances dans de nombreux cas)sudo buffer
si vous n'avez pas besoin les multiples sorties.Ce n'est pas la même chose du tout ...
Les éléments suivants semblent être quelque peu équivalents, mais ils ne le sont pas:
La différence critique est que le premier a écrit les données uniquement dans le fichier nommé, tandis que le dernier a écrit
hi
dans le terminal (stdout
) et dans le fichier nommé, comme indiqué ci-dessous:tee
vous permet d'écrire les données dans un fichier et de les utiliser dans un pipeline ultérieur, vous permettant de réaliser des tâches utiles, telles que la conservation des données à mi-chemin d'un pipeline:Ou bien, vous pouvez écrire dans un fichier avec des privilèges élevés, sans donner à l'ensemble du pipeline les privilèges élevés (ici, il
echo
est exécuté en tant qu'utilisateur, alors qu'il esttee
écrit dans le fichierroot
):Avec
tee
, vous pouvez écrire dans de nombreux fichiers ( etstdout
):Il est également possible d'utiliser
exec
avectee
pour enregistrer toute la sortie d'un script dans un fichier, tout en permettant à un observateur (stdout
) de voir les données:la source
exec > >(tee "$LOGFILE") 2>&1
dans un script bash qui permet au script de sortir stdout et stderr à la fois, stdout et le fichier pointé par$LOGFILE
.2>&1
pour supprimer la sortie et err à txt les fichiers dans Windows.C'est un tee:
Un raccord de tuyau en forme de T. Il a une entrée et deux sorties séparées.
En d'autres termes, il divise un tuyau en deux; comme une fourchette dans la route.
De même,
tee
un pipe (|
) vous permet de rediriger votre entrée standard vers deux sorties distinctes.Exemple
Dites par exemple, vous tapez
ls /
.Vous obtiendrez une sortie qui ressemble à quelque chose comme:
Redirige la sortie dans un fichier texte
ls / > ls.txt
, et aucune sortie n'est affichée dans le shell, uniquement dans le fichier texte obtenu.Voulez-vous voir la sortie ET le transférer dans un fichier texte en même temps?
Ajoutez un
tee
à votre pipe (|
) c'est à dire:ls / | tee ls.txt
Comparez les deux:
la source
Non . Vous arrive de mentionner l' un des rares exemples où l' on pouvait en effet rediriger vers le fichier à l' aide
>
et les>>
opérateurs.Mais Tee peut faire beaucoup plus. Parce que vous le dirigez, vous pouvez alors passer à autre chose.
Un bon exemple est listé sur la page wikipedia :
Fondamentalement, vous pouvez diriger le tuyau vers Tee, vous pouvez donc diriger le tuyau de Tee vers autre chose. Si tout ce que vous voulez, c’est écrire un fichier journal, alors vous n’avez pas vraiment besoin de Tee.
la source
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 souhaitez séparer un pipeline. Un exemple très simple est que vous avez un répertoire$d
que vous voulez tarer et que vous voulez aussi le hacher parce que vous êtes paranoïaque (comme moi) et ne faites pas confiance au support de stockage pour conserver les données de manière fiable. Vous pouvez d'abord l' écrire sur le disque, puis le hacher, mais cela échouera si l'archive est corrompue avant d'être hachée. De plus, vous devrez le lire et si vous travaillez sur des fichiers de plusieurs centaines de Go, vous saurez que vous ne voulez vraiment pas les relire si ce n'est pas nécessaire.Donc, ce que je fais est simplement ceci:
Il crée la boule de goudron et la dirige vers le té, qui la dirige ensuite vers deux sous-coques, l'une dans laquelle elle est hachée et l'autre dont elle est écrite sur le disque.
C'est également intéressant si vous souhaitez effectuer plusieurs opérations sur un gros fichier:
Lit le fichier une fois, le hachait (afin que vous puissiez vérifier s'il est toujours comme il se doit), l'extrait et le copie dans un emplacement différent. Pas besoin de le lire trois fois pour ça.
la source
tee
ne crée pas les sous-coques; le shell appelant s'exécutesha5sum
etcat
connecte sa sortie aux descripteurs de fichier auxquels il est transmistee
. En outre, une utilisation inutile decat
; vous pouvez utiliser la redirection d’entrée pour avoirtee
lu directement depuisfile.tar.gz
.cat
c'est l'amour.cat
c'est la vie.< file.tar.gz tee >(sha256sum) ...
si vous êtes préoccupé par l'ordre lexical des redirections. Cela ne change pas le fait qu'il n'est pas nécessaire de mettre en place un processus entièrement séparé pour simplement alimenter un seul fichiertee
.cat
est relativement faible. Le coût de 100 GiB supplémentaires d’appels système écriture + lecture fait définitivement perdre un temps processeur supplémentaire et une bande passante mémoire supplémentaire à votre exemple de fichier volumineux. N'oubliez pas que la bande passante mémoire est une ressource partagée entre tous les cœurs, sans parler de la pollution supplémentaire du cache N3 résultant de cette copie. Sur un x86 avec l’atténuation Spectre + Meltdown activée, les appels système sont plus coûteux qu’auparavant. Vous utilisez une quantité mesurable de temps processeur supplémentaire au cours de cette copie. Aussi>(cat > foo)
n'est pas plus facile à comprendre quefoo
, IMO.Nitpick sur la réponse de @ bertieb disant: Cet exemple montre que le tee est utilisé pour contourner une limitation inhérente à la commande sudo. sudo ne parvient pas à diriger la sortie standard vers un fichier.
Il n'y a pas de limitation inhérente, seulement un malentendu sur le traitement de la commande.
Exemple:
sudo echo 0 > /proc/sys/net/ipv4/ip_forward
Le shell actuel analyse la ligne de commande. Il trouve la redirection de sortie et l'exécute. Ensuite, il exécute la commande, qui est le
sudo
et fournit la ligne de commande restante en tant qu'arguments à la commande exécutée. Si le shell actuel ne dispose pas des autorisations root, la redirection de sortie échouera.echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
Cela fonctionne parce que la redirection de sortie est reportée à la
tee
commande, qui à ce stade dispose des autorisations root car elle a été exécutée viasudo
.sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
Cela fonctionne car le shell effectuant la redirection dispose des autorisations root.
la source
sudo
de la commande, mais pas du fichier en sortie et la redirection fonctionne parfaitement:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Comme d'autres personnes l'ont mentionné, la sortie de tuyauterie dans la
tee
commande écrit cette sortie à la fois dans un fichier et dans la sortie standard.J'utilise souvent
tee
lorsque je veux capturer la sortie d'une commande dont l'exécution est longue, tout en souhaitant également inspecter visuellement la sortie lorsque 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 avant d'inspecter la sortie.Ce qui ne semble pas encore avoir été mentionné (à moins que je ne l'aie pas manqué), c'est que la
tee
commande peut également écrire dans plusieurs fichiers à la fois. Par exemple:écrira tous les
*.png
fichiers du répertoire en cours dans deux fichiers différents (a.txt
etb.txt
) à la fois.En fait, vous pouvez taper du texte dans plusieurs fichiers différents à la fois avec
tee
ceci:la source
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). Le libellé 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 noms de répertoires pour déclencher des fichiers (à traiter par d'autres scripts de manière asynchrone) et j'utilise tee pour envoyer le même contenu à stdout. Toute la sortie standard est dirigée vers les journaux. Donc, j'ai mon texte où je le veux et j'ai une entrée de journal enregistrant que je l'ai fait, le tout à partir d'une seule déclaration '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 celui-ci ...
la source
touch
? (plus immédiatement évident ce qui se passe)touch
ne tronque pas les fichiers s'ils existent déjà, mais met à jour leur horodatage et laisse leur contenu tel quel ; maistee
va les tronquer. De plus, fairerm
+touch
est différent detee
(pensez aux liens durs et aux liens symboliques)truncate -s 0
? :-)Imaginez, vous voulez écrire le résultat d’une commande dans un fichier journal ET l’ imprimer sur stdout. Lorsque vous avez besoin de le faire en même temps, alors vous en avez besoin
tee
.Un cas d'utilisation consiste à créer des scripts qui écrivent l'intégralité de la construction sur stdout (par exemple pour Jenkins), mais également d'importants éléments en même temps dans un fichier journal séparé (pour les courriels récapitulatifs).
Vous allez vraiment commencer à manquer
tee
lorsque vous devez écrire un script dans Windows. Il n'y a pastee
et c'est vraiment ennuyeux.la source
tee
. Cmd n'a jamais été conçu pour des scripts sérieux - c'est à cela que servait VBS. Powershell est le nouvel outil de script à utiliser. Certes, Cmd est toujours assez puissant, mais les outils en ligne de commande sont assez peu nombreux.