Commandes de base

tee : Fonctionnement et utilisation de la commande tee sous Linux

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction



Dans cet article, nous allons parler de la commande tee sous Linux.
Elle est souvent employée dans les tutoriels, ou des documentations, mais nous allons voir en détails comment elle fonctionne.

Pour rappel, sous Linux, il existe deux types de sorties :
- La sortie standard (nommée stdout) est la sortie normale des commandes qui affichent les résultats attendus, tels que les résultats d'une commande, le contenu d'un fichier, ... Cette sortie est généralement envoyée vers le terminal par défaut.
- La sortie d'erreur (nommée stderr) est la sortie destinée aux messages d'erreur (erreurs de syntaxe, des permissions insuffisantes, des fichiers introuvables, ...) Ces messages sont généralement envoyés vers le terminal d'erreur standard, qui peut être redirigé séparément de la sortie standard en utilisant des opérateurs de redirection.

La commande tee lit l'entrée standard et la redirige sur la sortie standard et en même temps dans 1 ou plusieurs fichiers. Cette commande est souvent utilisée dans un enchainement de commandes avec un pipe.

L'utilisation générale sera de cette forme :

Code BASH :
commande | tee [OPTION] FICHIER


Voici une petite illustration de ce qui se passe :

Code TEXT :
STDIN -----> tee  -----> STDOUT
              |
              |
              v
           FICHIER


Nous allons voir des exemples concrets.


Utilisation



Voici un cas d'utilisation simple :

Code BASH :
echo coucou | tee coucou.txt


Dans ce cas, notre terminal affiche "coucou" ET le mot coucou s'est écrit dans le fichier coucou.txt.

C'est grossomodo l'équivalent des 2 commandes suivantes :
Code BASH :
echo coucou
echo coucou > coucou.txt


Vu que la commande tee renvoie sur la sortie standard, il est tout à fait possible d'enchainer une commande par la suite :

Code BASH :
ls -l / | tee racine.txt | grep lrwx


Ici, on liste la racine, on va stocker le contenu de ls -l dans le fichier racine.txt et on va filtrer l'affichage avec ce qui contient lrwx.

Sur mon système, le fichier racine.txt contient :

Code TEXT :
total 64
lrwxrwxrwx   1 root   root       7 Oct  9  2021 bin -> usr/bin
dr-xr-xr-x   4 root   root    4096 Oct  9  2021 boot
drwxr-xr-x   6 root   root     480 Jan 30 04:15 dev
drwxr-xr-x  71 root   root    4096 Jan 30 04:15 etc
drwxr-xr-x   3 root   root    4096 Oct  9  2021 home
lrwxrwxrwx   1 root   root       7 Oct  9  2021 lib -> usr/lib
lrwxrwxrwx   1 root   root       9 Oct  9  2021 lib64 -> usr/lib64
drwx------   2 nobody nobody 16384 May 19  2022 lost+found
drwxr-xr-x   2 root   root    4096 Oct  9  2021 media
drwxr-xr-x   2 root   root    4096 Oct  9  2021 mnt
drwxr-xr-x   2 root   root    4096 Oct  9  2021 opt
dr-xr-xr-x 506 nobody nobody     0 Jan 30 04:15 proc
dr-xr-x---   4 root   root    4096 Mar 28 08:57 root
drwxr-xr-x  16 root   root     460 Jan 30 04:15 run
lrwxrwxrwx   1 root   root       8 Oct  9  2021 sbin -> usr/sbin
drwxr-xr-x   2 root   root    4096 Sep 29  2021 selinux
drwxr-xr-x   2 root   root    4096 Oct  9  2021 srv
dr-xr-xr-x  13 nobody nobody     0 Jan 30 04:15 sys
drwxrwxrwt   2 root   root    4096 Apr  7 15:09 tmp
drwxr-xr-x  12 root   root    4096 May 19  2022 usr
drwxr-xr-x  19 root   root    4096 Jul  7  2022 var


Et le terminal affiche :

Code TEXT :
lrwxrwxrwx   1 root   root       7 Oct  9  2021 bin -> usr/bin
lrwxrwxrwx   1 root   root       7 Oct  9  2021 lib -> usr/lib
lrwxrwxrwx   1 root   root       9 Oct  9  2021 lib64 -> usr/lib64
lrwxrwxrwx   1 root   root       8 Oct  9  2021 sbin -> usr/sbin


Ne pas écraser le fichier écrit



Le contenu du fichier est écrasé à chaque fois (c'est le comportement par défaut de la commande tee).

Si on souhaite ajouter à la suite du fichier, l'option qui nous sera utile est l'option -a (comme append en anglais) :

Code BASH :
echo coucou2 | tee coucou.txt


C'est grossomodo l'équivalent des 2 commandes suivantes :
Code BASH :
echo coucou2 
echo coucou2 >> coucou.txt



Ignorer les interruptions



Une autre option intéressante à tee, c'est l'option -i (pour ignore interrupt).
Pour comprendre le fonctionnement, je vous propose de tester avec la sortie de la commande ping.
Par défaut, la commande ping est infinie. Un CTRL+C l'interrompt.

Code BASH :
ping gw.linuxtricks.lan | tee ping-gateway.txt


Si j'interrompt le ping, il s'affiche ceci dans le terminal ET dans le fichier :

Code TEXT :
PING gw.linuxtricks.lan (192.168.21.254) 56(84) bytes of data.
64 bytes from gw.linuxtricks.lan (192.168.21.254): icmp_seq=1 ttl=64 time=0.543 ms
64 bytes from gw.linuxtricks.lan (192.168.21.254): icmp_seq=2 ttl=64 time=0.591 ms
64 bytes from gw.linuxtricks.lan (192.168.21.254): icmp_seq=3 ttl=64 time=0.619 ms
^C


Avec l'option -i, ma commande ressemble à ceci :

Code BASH :
 ping gw.linuxtricks.lan | tee -i ping-gateway.txt


Si j'interrompt le ping, il s'affiche ceci dans le terminal ET dans le fichier :

Code TEXT :
PING gw.linuxtricks.lan (192.168.21.254) 56(84) bytes of data.
64 bytes from gw.linuxtricks.lan (192.168.21.254): icmp_seq=1 ttl=64 time=0.508 ms
64 bytes from gw.linuxtricks.lan (192.168.21.254): icmp_seq=2 ttl=64 time=0.489 ms
64 bytes from gw.linuxtricks.lan (192.168.21.254): icmp_seq=3 ttl=64 time=0.618 ms
^C
--- gw.linuxtricks.lan ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2009ms
rtt min/avg/max/mdev = 0.489/0.538/0.618/0.059 ms


On constate qu'on a la fin de l'exécution de la commande ping qui est générée (les statistiques)