tee : Fonctionnement et utilisation de la commande tee sous Linux
Table des matières
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 :
Voici une petite illustration de ce qui se passe :
Nous allons voir des exemples concrets.
Voici un cas d'utilisation simple :
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 :
Vu que la commande tee renvoie sur la sortie standard, il est tout à fait possible d'enchainer une commande par la suite :
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 :
Et le terminal affiche :
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) :
C'est grossomodo l'équivalent des 2 commandes suivantes :
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.
Si j'interrompt le ping, il s'affiche ceci dans le terminal ET dans le fichier :
Avec l'option -i, ma commande ressemble à ceci :
Si j'interrompt le ping, il s'affiche ceci dans le terminal ET dans le fichier :
On constate qu'on a la fin de l'exécution de la commande ping qui est générée (les statistiques)
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)