Tee

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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