Redirection des entrées et sorties sous Linux

CompTIABeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous découvrirez les techniques fondamentales de redirection des entrées et sorties dans le shell Linux. Vous explorerez comment contrôler le flux de données des commandes en manipulant les trois flux standard : la sortie standard (stdout), l'erreur standard (stderr) et l'entrée standard (stdin). Cet atelier propose des exercices pratiques sur les opérateurs de redirection essentiels, vous permettant de sauvegarder les résultats des commandes, de gérer les messages d'erreur et de fournir des données aux commandes à partir de fichiers.

Tout au long des exercices, vous utiliserez l'opérateur > pour envoyer la sortie d'une commande vers un fichier en écrasant le contenu existant, et l'opérateur >> pour ajouter la sortie à la fin d'un fichier sans perdre de données. Vous apprendrez également à rediriger spécifiquement les messages d'erreur avec 2> et à combiner la sortie standard et l'erreur standard dans un seul fichier. Enfin, vous utiliserez la commande tee pour afficher simultanément la sortie à l'écran et l'enregistrer dans un fichier, et vous pratiquerez la redirection de l'entrée standard avec l'opérateur < pour qu'une commande lise depuis un fichier plutôt qu'au clavier.

Rediriger la sortie standard avec l'opérateur >

Dans cette étape, vous apprendrez à rediriger la sortie standard d'une commande. Dans un shell Linux, la plupart des commandes produisent un résultat. Par défaut, ce résultat, appelé « Sortie Standard » (ou stdout), s'affiche sur votre écran de terminal. Cependant, vous pouvez rediriger cette sortie vers un fichier en utilisant l'opérateur >. Cela s'avère très utile pour sauvegarder les résultats de commandes, créer des fichiers journaux ou générer des rapports.

Tout d'abord, exécutons une commande simple pour voir son résultat sur le terminal.

echo "Hello from LabEx"

Vous devriez voir le message suivant s'afficher directement dans votre terminal :

Hello from LabEx

Maintenant, redirigeons cette sortie vers un fichier. Nous allons utiliser l'opérateur > suivi d'un nom de fichier. Cela indique au shell d'envoyer le résultat de la commande echo vers un fichier nommé hello.txt dans votre répertoire actuel (~/project).

Exécutez la commande suivante :

echo "Hello from LabEx" > hello.txt

Remarquez que cette fois, aucun résultat ne s'affiche sur le terminal. C'est parce que la sortie a été envoyée dans le fichier hello.txt. Vous pouvez vérifier le contenu du fichier à l'aide de la commande cat :

cat hello.txt

Le résultat affichera le texte qui a été redirigé :

Hello from LabEx

L'opérateur > créera le fichier s'il n'existe pas. Attention, si le fichier existe déjà, l'opérateur > écrasera tout son contenu sans aucun avertissement. Voyons cela en pratique.

Tout d'abord, listons le contenu du répertoire actuel et sauvegardons-le dans un nouveau fichier nommé file_list.txt.

ls -l > file_list.txt

Maintenant, visualisez le contenu de file_list.txt :

cat file_list.txt

Vous verrez une liste des fichiers de votre répertoire de projet, qui devrait ressembler à ceci :

total 4
-rw-rw-r-- 1 labex labex  0 Jun 25 14:56 file_list.txt
-rw-rw-r-- 1 labex labex 17 Jun 25 14:56 hello.txt

Maintenant, exécutons une commande différente et redirigeons sa sortie vers le même fichier, file_list.txt.

echo "This is new content." > file_list.txt

Si vous vérifiez à nouveau le contenu de file_list.txt, vous constaterez que la liste de fichiers originale a été remplacée.

cat file_list.txt

Le résultat est désormais :

This is new content.

Cela démontre le comportement d'écrasement de l'opérateur >. Dans l'étape suivante, vous apprendrez comment ajouter du contenu à un fichier sans l'écraser.

Ajouter à la sortie standard avec l'opérateur >>

Dans cette étape, vous apprendrez comment ajouter du contenu à la fin d'un fichier sans supprimer son contenu existant. Dans l'étape précédente, vous avez vu que l'opérateur > écrase le fichier de destination. Pour éviter cela, vous pouvez utiliser l'opérateur d'ajout, >>. Cet opérateur est extrêmement utile pour des tâches telles que la tenue d'un fichier journal (log) où vous souhaitez ajouter de nouvelles entrées au fil du temps.

Commençons par créer un fichier avec un contenu initial. Nous l'appellerons greetings.txt.

echo "Hello, this is the first line." > greetings.txt

Vérifiez maintenant son contenu :

cat greetings.txt

Le résultat devrait être :

Hello, this is the first line.

Ensuite, au lieu d'écraser le fichier, ajoutons une nouvelle ligne en utilisant l'opérateur >>.

echo "This is the second line, appended." >> greetings.txt

Vérifiez à nouveau le contenu de greetings.txt.

cat greetings.txt

Cette fois, vous verrez que la nouvelle ligne a été ajoutée après le contenu original :

Hello, this is the first line.
This is the second line, appended.

L'opérateur >> est idéal pour créer des fichiers journaux. Créons un fichier journal simple nommé activity.log et ajoutons-y un horodatage à l'aide de la commande date.

date > activity.log

Maintenant, ajoutons un autre horodatage au même fichier.

date >> activity.log

Visualisez le fichier activity.log final pour voir les deux entrées.

cat activity.log

Le résultat affichera deux horodatages, prouvant que la deuxième commande a ajouté sa sortie au lieu d'écraser le fichier. Les heures exactes varieront.

Wed Jun 25 14:56:53 CST 2025
Wed Jun 25 14:56:56 CST 2025

Cela montre comment >> préserve les données existantes et ajoute les nouvelles données à la fin du fichier, ce qui en fait un moyen sûr de mettre à jour des fichiers avec de nouvelles informations.

Rediriger l'erreur standard avec l'opérateur 2>

Dans cette étape, vous apprendrez à gérer les messages d'erreur. En plus de la sortie standard (stdout), les commandes produisent également un autre type de sortie appelé « Erreur Standard » (stderr). Il s'agit d'un flux distinct utilisé spécifiquement pour les messages d'erreur et les diagnostics. Par défaut, stdout et stderr s'affichent tous deux sur votre terminal, mais les opérateurs de redirection que vous avez appris jusqu'à présent (> et >>) n'affectent que stdout.

Pour rediriger stderr, vous devez spécifier son descripteur de fichier, qui est le chiffre 2. L'opérateur > est en fait un raccourci pour 1>, où 1 est le descripteur de fichier pour stdout. Ainsi, pour rediriger stderr, on utilise 2>.

Générons une erreur pour voir cela en action. Nous allons essayer de lister un fichier qui n'existe pas.

ls non_existent_file

Cette commande échouera et affichera un message d'erreur sur votre terminal :

ls: cannot access 'non_existent_file': No such file or directory

Maintenant, essayons de rediriger cela en utilisant l'opérateur standard >.

ls non_existent_file > output.txt

Remarquez que le message d'erreur s'affiche toujours sur le terminal. L'opérateur > ne l'a pas capturé. Si vous vérifiez le fichier output.txt, vous constaterez qu'il est vide.

cat output.txt

La commande ne produit aucun résultat car aucune sortie standard n'a été générée, seulement une erreur standard.

Maintenant, redirigeons correctement l'erreur standard vers un fichier nommé error.log en utilisant 2>.

ls non_existent_file 2> error.log

Cette fois, aucun message n'apparaît sur le terminal. L'erreur a été redirigée avec succès. Vous pouvez consulter le contenu de error.log pour voir le message capturé.

cat error.log

Le résultat sera le message d'erreur de la commande ls :

ls: cannot access 'non_existent_file': No such file or directory

Tout comme >> ajoute à la sortie standard, vous pouvez utiliser 2>> pour ajouter l'erreur standard à un fichier. Essayons de lister un autre fichier inexistant et d'ajouter l'erreur à notre fichier error.log.

ls another_fake_file 2>> error.log

Maintenant, vérifiez à nouveau le contenu de error.log.

cat error.log

Vous verrez que le nouveau message d'erreur a été ajouté à la fin du fichier.

ls: cannot access 'non_existent_file': No such file or directory
ls: cannot access 'another_fake_file': No such file or directory

Cette technique est très utile pour séparer les résultats normaux des messages d'erreur, vous permettant de consigner les erreurs pour un examen ultérieur sans encombrer vos fichiers de sortie principaux.

Rediriger stdout et stderr vers un seul fichier

Dans cette étape, vous apprendrez à capturer toute la sortie d'une commande — à la fois la sortie standard et l'erreur standard — dans un seul fichier. C'est particulièrement utile lorsque vous souhaitez conserver un enregistrement complet de l'exécution d'un script ou d'une commande, y compris les erreurs éventuelles.

Utilisons une commande qui produit à la fois stdout et stderr. Nous allons essayer de lister un fichier qui existe (/etc/passwd) et un autre qui n'existe pas (non_existent_file).

ls -l /etc/passwd non_existent_file

Vous verrez deux types de résultats sur votre terminal. La première ligne est l'erreur standard, et la seconde est la sortie standard.

ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18  2024 /etc/passwd

Si vous essayez de rediriger cela en utilisant uniquement > pour stdout, le message d'erreur apparaîtra toujours à l'écran.

ls -l /etc/passwd non_existent_file > output_only.txt

Sortie sur le terminal :

ls: cannot access 'non_existent_file': No such file or directory

Et output_only.txt ne contiendra que la sortie standard :

cat output_only.txt
-rw-r--r-- 1 root root 1916 Jul 18  2024 /etc/passwd

Pour rediriger les deux flux vers un seul fichier, vous pouvez utiliser l'opérateur &>. C'est un raccourci pratique qui envoie à la fois stdout (descripteur 1) et stderr (descripteur 2) vers le fichier spécifié.

Essayons. Nous allons rediriger toute la sortie vers un fichier nommé combined.log.

ls -l /etc/passwd non_existent_file &> combined.log

Cette fois, rien n'est affiché sur le terminal. Toute la sortie a été capturée dans combined.log. Voyons son contenu :

cat combined.log

Vous verrez que le fichier contient à la fois la sortie standard et l'erreur standard :

ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18  2024 /etc/passwd

Il existe également une syntaxe plus traditionnelle, mais légèrement plus complexe, pour obtenir le même résultat : > file 2>&1. Décomposons-la :

  • > file : Redirige la sortie standard (descripteur 1) vers file.
  • 2>&1 : Redirige l'erreur standard (descripteur 2) vers le même endroit que la sortie standard (descripteur 1). Comme stdout va déjà vers file, stderr y est également envoyé.

Essayons cette méthode en enregistrant la sortie dans combined_traditional.log.

ls -l /etc/passwd non_existent_file > combined_traditional.log 2>&1

Là encore, aucune sortie n'apparaît sur le terminal. La vérification du contenu du fichier montre le même résultat :

cat combined_traditional.log
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18  2024 /etc/passwd

Bien que &> soit plus court et souvent préféré, vous rencontrerez fréquemment 2>&1 dans les scripts plus anciens, il est donc important de comprendre son fonctionnement. Pour ajouter les deux flux à la fin d'un fichier, vous pouvez utiliser &>> ou >> file 2>&1.

Utiliser tee pour diviser la sortie et rediriger l'entrée standard avec <

Dans cette dernière étape, vous explorerez deux concepts de redirection complémentaires : la division de la sortie avec la commande tee et la fourniture de données à une commande à partir d'un fichier à l'aide de l'opérateur <.

Diviser la sortie avec tee

Parfois, vous souhaitez enregistrer la sortie d'une commande dans un fichier tout en la visualisant simultanément sur le terminal. Les opérateurs > et >> redirigent la sortie exclusivement vers un fichier, la masquant de l'écran. La commande tee résout ce problème en divisant la sortie, l'envoyant à la fois vers un fichier et vers la sortie standard (votre écran). Son nom vient du raccord en « T » utilisé en plomberie, qui divise un flux en deux directions.

Voyons cela en action. Nous allons lister le contenu du répertoire /etc/ et utiliser tee pour afficher la liste à l'écran et l'enregistrer dans un fichier nommé etc_listing.txt.

ls /etc/ | tee etc_listing.txt

Vous verrez la liste complète du répertoire s'afficher sur votre terminal. En même temps, la commande tee a écrit exactement la même sortie dans etc_listing.txt. Vous pouvez le vérifier :

cat etc_listing.txt

Le contenu du fichier correspondra à ce que vous avez vu à l'écran.

Par défaut, tee écrase le fichier de destination. Pour ajouter à un fichier à la place, utilisez l'option -a. C'est très utile pour la journalisation. Créons un fichier journal et ajoutons-y deux entrées.

date | tee system_log.txt
echo "User labex performed a system check." | tee -a system_log.txt

La première commande crée system_log.txt avec la date actuelle. La deuxième commande, utilisant tee -a, ajoute une nouvelle ligne sans supprimer la date. Vérifions le fichier final :

cat system_log.txt

Le résultat affichera les deux lignes :

Wed Jun 25 14:56:53 CST 2025
User labex performed a system check.

Rediriger l'entrée standard avec <

Examinons maintenant l'opposé de la redirection de sortie : la redirection de l'entrée standard (stdin). De nombreuses commandes, comme sort, wc ou cat, peuvent lire des données depuis stdin (généralement votre clavier). L'opérateur < vous permet d'indiquer à une commande de récupérer ses données d'entrée à partir d'un fichier à la place.

Tout d'abord, créons un fichier simple avec une liste d'éléments. Nous l'appellerons items.txt.

echo "banana" > items.txt
echo "apple" >> items.txt
echo "cherry" >> items.txt

Nous avons maintenant un fichier items.txt contenant trois éléments non triés. La commande sort peut trier des lignes de texte. Utilisons < pour injecter items.txt dans la commande sort.

sort < items.txt

La commande lira le contenu de items.txt comme entrée, le triera et affichera le résultat sur sa sortie standard (le terminal) :

apple
banana
cherry

C'est fonctionnellement similaire à l'exécution de sort items.txt, mais cela démontre le concept puissant de redirection d'un fichier vers l'entrée standard d'une commande. Cela devient essentiel lors de l'utilisation de commandes qui ne peuvent lire que depuis stdin et n'acceptent pas de nom de fichier comme argument.

Comme dernier exemple, considérons cat < items.txt. Cela indique à cat de lire son entrée depuis items.txt et, comme le rôle de cat est d'afficher son entrée sur sa sortie, il affiche le contenu du fichier à l'écran.

cat < items.txt

Ceci conclut notre tour d'horizon de la redirection de base des E/S sous Linux. Vous disposez désormais des outils nécessaires pour contrôler d'où vos commandes tirent leurs données et où leurs résultats sont envoyés.

Résumé

Dans cet atelier, vous avez appris les bases de la redirection des sorties de commandes sous Linux. Vous avez commencé par utiliser l'opérateur > pour envoyer la sortie standard (stdout) d'une commande vers un fichier, en notant que cet opérateur écrase le fichier de destination s'il existe déjà. Pour éviter l'écrasement, vous avez utilisé l'opérateur >> pour ajouter la sortie à la fin d'un fichier. Vous avez également pratiqué la redirection de l'erreur standard (stderr) vers un fichier à l'aide de l'opérateur 2>, ce qui est utile pour capturer les messages d'erreur séparément de la sortie standard.

De plus, l'atelier a démontré comment combiner ces concepts en redirigeant à la fois stdout et stderr vers un seul fichier pour une journalisation complète. Vous avez exploré la commande tee comme méthode pour diviser la sortie, permettant de l'enregistrer dans un fichier tout en l'affichant simultanément sur le terminal. Enfin, vous avez appris à rediriger l'entrée standard (stdin) à l'aide de l'opérateur <, permettant à une commande de lire ses données depuis un fichier plutôt qu'au clavier.