Présentation
Lorsque l'utilisateur exécute une commande dans un shell interactif Linux, la sortie s'affiche dans le terminal texte. Cependant, il existe des moyens de modifier ce comportement à l'aide de commandes shell supplémentaires connectées dans un pipeline.
Dans ce didacticiel, vous apprendrez à utiliser la commande tee sous Linux pour gérer la sortie d'une commande.

Prérequis
- Un système exécutant Linux
- Accès à la ligne de commande ou au terminal
- Privilèges Sudo
Que fait la commande tee sous Linux ?
Le tee
La commande lit l'entrée standard (stdin) et l'écrit à la fois sur la sortie standard (stdout) et sur un ou plusieurs fichiers. tee
fait généralement partie d'un pipeline, et n'importe quel nombre de commandes peut le précéder ou le suivre.

commandes tee sous Linux avec exemples
Le tee
La commande est utilisée seule ou avec des options supplémentaires. Les sections suivantes répertorient les options disponibles et fournissent des exemples d'utilisation des commandes.
Utilisation de base
La syntaxe de base pour le tee
la commande est :
[command] | tee [options] [filename]
L'exemple ci-dessous illustre l'utilisation de tee
pour créer un fichier qui stocke des informations sur une interface réseau tout en fournissant la même sortie dans le terminal :

La commande cat confirme que tee
écrit avec succès la sortie de ifconfig
au fichier example.txt
:

Si le fichier utilisé pour la commande existe déjà, tee
écrase le contenu précédent du fichier.
Ajouter au fichier donné
L'écrasement du contenu du fichier est le comportement par défaut du tee
commande. Utilisez l'argument -a
(ou --append
) pour ajouter la sortie de la commande à la fin du fichier.
[command] | tee -a [filename]
Par exemple, utilisez le echo
commande pour ajouter une ligne de texte à un fichier :

Confirmez l'ajout réussi avec le cat
commande :

Écrire dans plusieurs fichiers
Utilisez tee
suivi d'un nombre quelconque de fichiers pour écrire la même sortie dans chacun d'eux :
[command] | tee [options] [filename1] [filename2]...
L'exemple ci-dessous montre l'écriture de la sortie du echo
commande à deux fichiers :

Le ls
la commande montre que tee
fichiers créés avec succès example1.txt
et example2.txt
.
Masquer la sortie
Dire tee
pour stocker la sortie de la commande dans un fichier et ignorer la sortie du terminal, utilisez la syntaxe suivante :
[command] | tee [options] [filename] >/dev/null
Dans l'exemple ci-dessous, tee
crée un fichier contenant les données de l'interface réseau, en ignorant la sortie standard :

Rediriger la sortie d'une commande vers une autre
tee
ne doit pas nécessairement être la dernière commande du pipeline. Utilisez-le pour transmettre la sortie à une autre commande :
[command] | tee [options] [filename] | [command]
Dans l'exemple suivant, tee
stocke la sortie du ls
commande à example.txt
et transmet le contenu de ce fichier à la commande grep, qui recherche et affiche toutes les instances du mot "exemple":

Ignorer les interruptions
Pour activer tee
pour sortir correctement même après l'interruption de la commande précédente, ajoutez l'argument -i
(ou --ignore-interrupts
):
[command] | tee -i [filename]
L'exemple suivant montre tee
écrire la sortie de la commande ping et terminer l'action avec succès même après ping
est interrompu par Ctrl+C
:

Utiliser le tee avec Sudo
Pour activer tee
pour écrire dans un fichier appartenant à la racine ou dans un fichier appartenant à un autre utilisateur, placez la commande sudo juste avant tee
.
[command] | sudo tee [options] [filename]
L'exemple ci-dessous montre une tentative infructueuse d'écrire dans le sudoex.txt
appartenant à la racine . Lorsque le sudo
commande est ajoutée, l'opération se termine :

Utiliser tee dans l'éditeur Vim
Si vous ouvrez et modifiez un fichier appartenant à la racine dans Vim sans utiliser le sudo
commande, la tentative d'enregistrement des modifications génère une erreur :

Pour ignorer cette erreur, saisissez ce qui suit dans Vim :
:w !sudo tee %

Après avoir entré le sudo
mot de passe, Vim affiche un avertissement mais écrit les modifications dans le fichier.
Diagnostiquer les erreurs d'écriture dans des non-canaux
Pour instruire tee
pour imprimer un message d'erreur lorsque le processus échoue, utilisez le -p
argument :
[command] | tee -p [filename]
L'action par défaut de tee -p
est de quitter et d'imprimer le message d'erreur immédiatement après avoir détecté l'erreur d'écriture dans un tube. Pour modifier le comportement de la commande en cas d'erreur d'écriture, utilisez le --output-error
argument, suivi du mode spécifiant le comportement :
[command] | tee --output-error=[mode] [filename]
Il existe quatre modes possibles :
warn
– diagnostique les erreurs d'écriture sur n'importe quelle sortie.warn-nopipe
- diagnostique les erreurs d'écriture sur n'importe quelle sortie non pipe.exit
– se termine en cas d'erreur d'écriture sur n'importe quelle sortie.exit-nopipe
- se termine en cas d'erreur d'écriture sur une sortie non pipe.
Utiliser la commande tee avec le script bash
Le tee
La commande se trouve souvent dans les scripts bash. Prenons l'exemple suivant :

Le script ci-dessus imprime le message "Hello World" et stocke la sortie dans un fichier journal. L'exécution du script crée un fichier journal dans le tmp
dossier. Le journal contient la sortie du script :

Fichiers journaux de surveillance
L'écriture de la sortie du script dans un fichier journal est généralement effectuée avec le >
opérateur :
./testbash.sh > testbash.log
La commande ci-dessus crée un fichier journal mais n'écrit rien sur la sortie standard.
Utilisez tee
pour créer un fichier journal et voir la sortie dans le terminal :
./testbash.sh | tee testbash.log
Voir l'aide et les informations de version
Voir la version actuelle du tee
commande en tapant :
tee --version
Pour les instructions concernant le tee
la syntaxe de la commande et les arguments disponibles, utilisez l'argument d'aide de la commande :
tee --help