Tee
| Fiche express | |
|---|---|
| Domaine | Redirection / duplication de flux |
| Commande | tee
|
| Contexte | Tout Unix/Linux — POSIX |
| Piège classique | sudo tee fichier oui |
| Voir aussi | redirections shell, sudo
|
tee est une commande qui lit l'entrée standard, l'affiche telle quelle sur la sortie standard, et l'écrit en même temps dans un ou plusieurs fichiers. Le nom vient du raccord en T de plomberie : le flux est dupliqué sans être interrompu, ce qui permet de garder l'affichage à l'écran tout en conservant une copie dans un fichier, typiquement au milieu d'un pipeline.
Usage de base
commande | tee fichier.log # affiche la sortie ET l'écrit dans fichier.log (écrasé s'il existe)
Exemple concret : garder une trace d'une commande longue tout en suivant son avancement en direct.
ping -c 5 example.com | tee ping.log
Sans tee il faudrait choisir entre voir la sortie (pas de log) ou la rediriger avec > (plus rien à l'écran). tee permet les deux en même temps.
Ajouter au lieu d'écraser (-a)
Par défaut, tee écrase le fichier de destination à chaque exécution. L'option -a (append) ajoute à la fin du fichier existant au lieu de l'écraser, exactement comme >> pour une redirection classique.
commande | tee -a fichier.log # ajoute à la fin de fichier.log sans écraser le contenu précédent
Écrire dans un fichier protégé via sudo
Piège classique : sudo echo "valeur" > /fichier/protege échoue même en root, avec une erreur de permission refusée sur le fichier. La raison est que sudo ne s'applique qu'à la commande echo : la redirection > est traitée par le shell courant, avant même que sudo n'entre en jeu, donc c'est l'utilisateur non privilégié qui tente d'ouvrir le fichier en écriture.
sudo echo "valeur" > /etc/fichier_protege # échoue : la redirection s'exécute hors du sudo
La solution consiste à faire écrire le fichier par une commande qui, elle, tourne réellement sous sudo — c'est exactement le rôle de tee : il ouvre lui-même le fichier en écriture, en tant que root, pendant que la redirection reste au niveau du pipe (non privilégié, ce qui ne pose pas de problème car aucun fichier n'y est ouvert).
echo "valeur" | sudo tee /etc/fichier_protege # fonctionne : tee ouvre le fichier en root
echo "valeur" | sudo tee -a /etc/fichier_protege # variante append, mêmes privilèges
Utile aussi pour éditer rapidement un fichier système en une ligne, par exemple pour activer un paramètre sysctl sans ouvrir d'éditeur :
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Pour rendre silencieuse la sortie affichée à l'écran (utile dans un script), rediriger tee vers /dev/null :
echo "valeur" | sudo tee /etc/fichier_protege > /dev/null
Dupliquer vers plusieurs fichiers
tee accepte plusieurs noms de fichiers en arguments : la même entrée est écrite dans chacun d'eux, en plus d'être affichée à l'écran.
commande | tee fichier1.log fichier2.log fichier3.log
Combiné avec -a, chacun des fichiers est complété plutôt qu'écrasé.
tee et /dev/tty
/dev/tty représente le terminal courant. Rediriger vers ce fichier spécial permet de forcer l'affichage à l'écran même quand la sortie standard est elle-même redirigée ailleurs (fichier, autre commande) — utile par exemple pour garder une trace visible pendant qu'un script capture tout dans un fichier de log.
commande | tee /dev/tty | autre_commande > resultat.log
Ici, la sortie de commande reste visible à l'écran via /dev/tty tout en étant transmise à autre_commande, dont le résultat final est stocké dans resultat.log.
Options utiles
tee -a fichier # append au lieu d'écraser
tee -i fichier # ignore les signaux d'interruption (SIGINT)
tee --output-error=... fichier # comportement en cas d'erreur d'écriture (GNU coreutils)
Voir aussi
- redirections shell (
>,>>, pipes|) sudo— élévation de privilèges