Redirections & Tubes (Pipes)

Linux
Système & Réseau
Maîtriser les 3 descripteurs standards (0 stdin, 1 stdout, 2 stderr), les opérateurs de redirection (>, 2>&1, &>), les tubes (|), tee et la substitution $(…).

La véritable puissance d’UNIX ne réside pas dans des programmes géants qui tentent de tout faire, mais dans la capacité à assembler de petites commandes spécialisées comme des briques de Lego. Ce mécanisme d’assemblage repose sur trois canaux de communication universels : les descripteurs de flux standards.

🔌 Les 3 Descripteurs de Communication (0, 1, 2)

Dès la connexion au Shell, chaque processus lancé dispose automatiquement de trois flots de communication identifiés par un numéro de descripteur :

0 — stdin (Entrée Standard)

C’est le canal par lequel la commande reçoit des données à traiter.

  • Association par défaut : Le clavier de l’utilisateur.
  • Numéro de descripteur : 0
1 — stdout (Sortie Standard)

C’est le canal sur lequel la commande envoie ses résultats normaux.

  • Association par défaut : L’écran du terminal.
  • Numéro de descripteur : 1
2 — stderr (Sortie d’Erreur)

Canal séparé réservé aux messages d’erreur et d’alerte pour ne pas polluer les résultats normaux.

  • Association par défaut : L’écran du terminal.
  • Numéro de descripteur : 2

🔀 Les Redirections de Flux (>, >>, <, 2>, &>)

Une redirection consiste à débrancher l’un de ces trois tuyaux de son périphérique par défaut (clavier ou écran) pour le relier à un fichier. Elle s’applique uniquement à la commande sur laquelle elle porte :

Syntaxe de Redirection Flux modifié Comportement exact
commande > fichier 1 stdout \(\rightarrow\) Fichier Redirige la sortie normale dans fichier (écrase le fichier s’il existait déjà).
commande >> fichier 1 stdout \(\rightarrow\) Fichier Redirige la sortie normale à la suite (en fin de fichier) sans écraser l’existant.
commande < fichier Fichier \(\rightarrow\) 0 stdin Injecte le contenu de fichier sur l’entrée standard de la commande à la place du clavier.
commande 2> erreurs.log 2 stderr \(\rightarrow\) Fichier Capture uniquement les erreurs dans un fichier (ou les jette dans le trou noir avec 2> /dev/null).
commande 2>&1 ou &> 1 + 2 \(\rightarrow\) Même cible Fusionne la sortie d’erreur (2) avec la sortie standard (1). Syntaxe courte : commande &> tout.log.

🧪 Simulateur Interactif : Routage des Descripteurs stdin, stdout et stderr

Sélectionnez un câblage de redirection ci-dessous pour visualiser comment les flux 1 stdout et 2 stderr se séparent ou fusionnent :

Banc de Routage des Flux Standards (0, 1, 2)

stdout (1) et stderr (2) s’affichent tous les deux sur l’écran du terminal.

stdout (1) est écrit dans ok.txt, tandis que stderr (2) reste visible à l’écran !

stdout (1) s’affiche à l’écran, et les erreurs stderr (2) sont aspirées dans /dev/null.

stdout (1) et stderr (2) sont fusionnés (2>&1) et enregistrés ensemble dans complet.log.

Aperçu Écran vs Fichier Disque

🔗 Le Tube (|), tee, Groupement (...) et Substitution $(...)

Au lieu de rediriger la sortie d’une commande vers un fichier sur le disque, le tube (pipe, noté |) connecte directement le tuyau 1 stdout d’une première commande sur le tuyau 0 stdin d’une seconde commande en mémoire vive :

commande1 | commande2
Le Tube (|) et le Raccord en T (tee)
  • Le Tube simple (|) : Permet de filtrer, trier ou compter à la volée :

    # Lire les journaux du noyau et n'afficher que les 10 dernières lignes
    dmesg | tail
    
    # Compter combien de fichiers .conf se trouvent dans /etc
    ls /etc/*.conf | wc -l
  • La commande tee (Embranchement en T) : Quand on utilise > ou |, on ne voit plus le résultat intermédiaire à l’écran. La commande tee fichier lit stdin, l’enregistre dans fichier tout en le recopiant sur stdout :

    # Affiche les logs à l'écran ET les sauvegarde dans trace.log
    dmesg | tail | tee trace.log
Groupement (...) & Substitution $(...)
  • Regroupement de commandes (...) : Permet de rassembler plusieurs commandes successives pour les considérer comme une seule unité face à un tube ou une redirection :

    # Redirige la sortie des deux commandes réunies dans rapport.txt
    (uname -a; df -h) > rapport.txt
  • Substitution de commande $(commande) (ou `commande`) : Exécute la commande entre parenthèses en premier et remplace l’expression par son résultat texte :

    # Crée un dossier nommé avec la date du jour (ex: backup_2026-11-02)
    mkdir "backup_$(date +%F)"
💡 Pourquoi préférer $(commande) aux anciens backticks `commande` ?

La syntaxe moderne $(commande) est beaucoup plus lisible (impossible de confondre un backtick ` avec une apostrophe simple ') et supporte l’imbrication sans effort : echo $(dirname $(which bash)).