Redirection des flux de données

LinuxLinuxBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Sous Linux, la redirection est une fonctionnalité puissante qui vous permet de contrôler où vont les entrées et sorties des commandes. Vous avez peut-être déjà vu des opérateurs comme > ou >> dans des laboratoires précédents. Ceux-ci sont utilisés pour rediriger la sortie vers des fichiers. Ce laboratoire vous introduira au concept de redirection et vous guidera à travers divers exemples pratiques, adaptés aux débutants sans aucune connaissance préalable de Linux.

Ceci est un laboratoire guidé (Guided Lab), qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent qu'il s'agit d'un laboratoire de niveau débutant avec un taux d'achèvement de 97%. Il a reçu un taux d'avis positifs de 98% de la part des apprenants.

Redirection de sortie de base

Commençons par les bases de la redirection de sortie :

  1. Ouvrez votre terminal. Vous devriez vous trouver dans le répertoire /home/labex/project. Si vous n'êtes pas sûr, vous pouvez taper pwd (print working directory) pour vérifier votre emplacement actuel.

  2. Nous allons créer un nouveau fichier nommé redirect avec du contenu. Tapez la commande suivante :

    echo 'hello labex' > redirect

    Cette commande fait deux choses :

    • echo 'hello labex' affiche le texte "hello labex"
    • Le symbole > redirige cette sortie vers un fichier nommé redirect

    Si le fichier n'existe pas, il sera créé. S'il existe déjà, son contenu sera écrasé.

  3. Maintenant, ajoutons plus de contenu au même fichier :

    echo 'labex.io' >> redirect

    L'opérateur >> est similaire à >, mais au lieu d'écraser le fichier, il ajoute le nouveau contenu à la fin du fichier existant.

  4. Pour afficher le contenu du fichier que nous venons de créer et de modifier, utilisez la commande cat :

    cat redirect

    Vous devriez voir les deux lignes que nous avons ajoutées au fichier : "hello labex" sur la première ligne, et "labex.io" sur la deuxième ligne.

Comprendre l'entrée, la sortie et l'erreur standard

Avant de plonger plus profondément dans la redirection, comprenons trois concepts importants :

  1. Entrée Standard (stdin) : C'est la source d'entrée par défaut, généralement votre clavier. C'est de là que le système attend les entrées.
  2. Sortie Standard (stdout) : C'est la destination de sortie par défaut, généralement votre écran. C'est là que le système envoie la sortie normale.
  3. Erreur Standard (stderr) : C'est là que les messages d'erreur sont envoyés, également généralement votre écran. Elle est séparée de stdout pour permettre aux messages d'erreur d'être gérés différemment si nécessaire.

Sous Linux, ceux-ci sont représentés par des descripteurs de fichiers (file descriptors), qui ne sont que des nombres représentant des fichiers ouverts :

Descripteur de fichier Fichier de périphérique Description
0 /dev/stdin stdin
1 /dev/stdout stdout
2 /dev/stderr stderr

Voyons un exemple de la façon dont nous pouvons les utiliser :

  1. Tout d'abord, créons un nouveau répertoire appelé Documents :

    mkdir Documents

    Cette commande crée un nouveau répertoire. Si vous recevez un message d'erreur indiquant que le répertoire existe déjà, ce n'est pas grave – cela signifie que vous pouvez utiliser celui qui existe.

  2. Maintenant, créons un fichier C dans ce répertoire :

    cat > Documents/test.c << EOF
    #include <stdio.h>
    
    int main()
    {
        printf("hello world\n");
        return 0;
    }
    EOF

    Cette commande fait plusieurs choses :

    • cat > lance le processus d'écriture dans un fichier
    • Documents/test.c est le fichier dans lequel nous écrivons
    • << EOF indique au shell de continuer à accepter l'entrée jusqu'à ce qu'il rencontre "EOF" (End Of File - Fin de fichier)
    • Les lignes intermédiaires sont le contenu que nous écrivons dans le fichier
    • Le EOF final marque la fin de l'entrée
  3. Maintenant, affichons le contenu de ce fichier :

    cat Documents/test.c

    Vous devriez voir le code C que nous venons de créer.

Redirection de l'erreur standard

Explorons maintenant comment rediriger l'erreur standard :

  1. Essayez de lire deux fichiers, l'un qui existe et l'autre qui n'existe pas :

    cat Documents/test.c nonexistent.c

    Vous verrez le contenu de test.c (qui existe) et un message d'erreur pour nonexistent.c (qui n'existe pas). Le contenu de test.c est envoyé à stdout, tandis que le message d'erreur est envoyé à stderr.

  2. Maintenant, redirigeons la sortie standard vers un fichier et l'erreur standard vers un autre fichier :

    cat Documents/test.c nonexistent.c > output.log 2> error.log

    Cette commande fait plusieurs choses :

    • cat Documents/test.c nonexistent.c tente d'afficher le contenu des deux fichiers
    • > output.log redirige stdout (descripteur de fichier 1) vers un fichier nommé output.log
    • 2> error.log redirige stderr (descripteur de fichier 2) vers un fichier nommé error.log
  3. Affichez le contenu des deux fichiers :

    echo "Output log:"
    cat output.log
    echo "Error log:"
    cat error.log

    Vous devriez voir le contenu de test.c dans output.log et le message d'erreur concernant nonexistent.c dans error.log.

Combiner la sortie standard et l'erreur standard

Parfois, vous voudrez peut-être rediriger à la fois la sortie standard et l'erreur standard vers le même fichier. Ceci est particulièrement utile lorsque vous souhaitez capturer toute la sortie d'une commande, qu'il s'agisse de sortie normale ou de messages d'erreur.

  1. Essayons de lister le contenu de notre répertoire actuel et d'un répertoire inexistant en une seule commande :

    ls -l . nonexistent_directory > combined_output.log 2>&1

    Cette commande fait plusieurs choses :

    • ls -l . liste le contenu du répertoire actuel
    • nonexistent_directory est une tentative de lister un répertoire qui n'existe pas
    • > combined_output.log redirige stdout vers un fichier nommé combined_output.log
    • 2>&1 redirige stderr vers le même emplacement que stdout (qui est combined_output.log dans ce cas)
  2. Maintenant, vérifions le contenu de notre fichier de sortie combinée :

    cat combined_output.log

    Vous devriez voir à la fois la liste du répertoire et le message d'erreur concernant le répertoire inexistant dans ce fichier.

  3. Il existe un moyen abrégé de rediriger à la fois stdout et stderr vers le même fichier dans bash :

    ls -l . nonexistent_directory &> another_combined_output.log

    L'opérateur &> est équivalent à > file 2>&1.

  4. Vérifiez le contenu de ce nouveau fichier :

    cat another_combined_output.log

    Vous devriez voir la même sortie que dans le fichier précédent.

Utilisations avancées de /dev/null

Le périphérique /dev/null, souvent appelé "bit bucket" ou "trou noir", est un fichier spécial qui ignore toutes les données qui lui sont écrites. Il a plusieurs applications utiles dans les scripts shell et les opérations en ligne de commande.

  1. Supprimer la sortie d'une commande :
    Nous avons déjà vu comment supprimer la sortie standard :

    ls -l > /dev/null

    Et comment supprimer à la fois la sortie standard et l'erreur standard :

    ls -l nonexistent_directory > /dev/null 2>&1
  2. Supprimer uniquement les messages d'erreur :
    Parfois, vous voulez voir la sortie mais pas les messages d'erreur :

    ls -l . nonexistent_directory 2> /dev/null

    Vous devriez voir la liste du répertoire, mais pas l'erreur concernant le répertoire inexistant.

  3. Utiliser /dev/null comme fichier vide :
    /dev/null peut être utilisé comme entrée de fichier vide. Ceci est utile pour les commandes qui nécessitent un fichier d'entrée mais vous ne voulez fournir aucune entrée réelle. Par exemple :

    grep "pattern" /dev/null

    Cette commande ne produira aucune sortie car /dev/null est un fichier vide.

  4. Tester l'existence d'un fichier :
    Vous pouvez utiliser /dev/null pour tester si un fichier existe sans produire de sortie :

    if cp Documents/test.c /dev/null 2> /dev/null; then
      echo "File exists and is readable"
    else
      echo "File does not exist or is not readable"
    fi

    Ce script tente de copier test.c vers /dev/null. Si cela réussit, cela signifie que le fichier existe et est lisible.

  5. Vider le contenu d'un fichier :
    Vous pouvez utiliser /dev/null pour vider rapidement le contenu d'un fichier :

    cat /dev/null > combined_output.log

    Vérifiez que le fichier est maintenant vide :

    cat combined_output.log

    Vous ne devriez voir aucune sortie, indiquant que le fichier est maintenant vide.

Résumé

Dans ce laboratoire, vous avez découvert la redirection des flux de données sous Linux. Vous avez pratiqué :

  1. La redirection de sortie de base à l'aide de > et >>.
  2. La compréhension de l'entrée standard, de la sortie standard et de l'erreur standard.
  3. La redirection de l'erreur standard à l'aide de 2>.
  4. Le rejet de la sortie en redirigeant vers /dev/null.

Ces techniques de redirection sont des outils puissants sous Linux qui vous permettent de contrôler où va la sortie de vos commandes. Elles sont essentielles pour le scripting, la journalisation et la gestion efficace de la sortie des commandes. Au fur et à mesure que vous continuerez à travailler avec Linux, vous trouverez de nombreuses situations où ces techniques seront utiles.