2006 - aujourd'hui (MCF) > Résumé redirections et pipes

Entrées/sorties standants

  • Lors de l'exécution d'une commande, un processus est créé. Celui-ci va alors ouvrir au moins trois flux :
    • stdin, appelée entrée standard, dans lequel le processus va lire les données d'entrée. Par défaut stdin correspond au clavier ; STDIN est identifié par le numéro 0 ;
    • stdout, appelée sortie standard, dans lequel le processus va écrire les données de sortie. Par défaut stdin correspond à l'écran ; STDOUT est identifié par le numéro 1 ;
    • stderr, appelée erreur standard, dans lequel le processus va écrire les messages d'erreur. Par défaut stderr correspond à l'écran. STDERR est identifié par le numéro 2 ;

      stdout

  • Par défaut lorsque l'on exécute un programme, les données sont donc lues à partir du clavier et le programme envoie sa sortie et ses erreurs sur l'écran, mais il est possible de lire les données à partir de n'importe quel périphérique d'entrée, voire à partir d'un fichier et d'envoyer la sortie sur un périphérique d'affichage, un fichier, etc.

Redirections --- > et >> : rediriger le résultat dans un fichier

  • Linux, comme tout système de type Unix, possède des mécanismes permettant de rediriger les entrées-sorties standards vers des fichiers.
  • Ainsi, l'utilisation du caractère «>» permet de rediriger la sortie standard d'une commande située à gauche vers le fichier situé à droite :
    ls -al /home/jf/ > toto.txt
    echo "Toto" > /etc/monfichierdeconfiguration

    Si le fichier n'existe pas à droite, par exemple toto.txt, Linux le créé.
  • La commande suivante est équivalente à une copie de fichiers :
    cat toto > toto2
  • La redirection «>» a pour but de créer un nouveau fichier. Ainsi, si un fichier du même nom existait, celui-ci sera écrasé. La commande suivante crée tout simplement un fichier vide :
    > fichier
  • L'emploi d'un double caractère «>>» permet de concaténer la sortie standard vers le fichier, c'est-à-dire ajouter la sortie à la suite du fichier, sans l'écraser.
  • Nous venons de découvrir 2 flux de redirection dans des fichiers :
    • > : redirige dans un fichier et l'écrase s'il existe déjà;
    • >> : redirige à la fin d'un fichier et le crée s'il n'existe pas.

      2 flux de redirections

  • De manière analogue, le caractère «<» indique une redirection de l'entrée standard. La commande suivante envoie le contenu du fichier toto.txt en entrée de la commande cat, dont le seul but est d'afficher le contenu sur la sortie standard (exemple inutile mais formateur) :
    cat < toto.txt
  • Enfin l'emploi de la redirection «<<» permet de lire sur l'entrée standard jusqu'à ce que la chaîne située à droite soit rencontrée. Ainsi, l'exemple suivant va lire l'entrée standard jusqu'à ce que le mot STOP soit rencontré, puis va afficher le résultat :
    cat << STOP

Redirections --- 2>, 2>> et 2>&1 : rediriger les erreurs

  • Allons un peu plus loin. Il faut savoir que toutes les commandes produisent 2 flux de données différents :
    • La sortie standard : pour tous les messages (sauf les erreurs),
    • La sortie d'erreurs : pour toutes les erreurs.
  • Prenons un exemple concret pour voir comment ça se passe.
    Supposons que vous fassiez un cat du fichier notes.csv pour afficher son contenu. Il y a 2 possibilités :
    • Si tout va bien : le résultat (le contenu du fichier) s'affiche sur la sortie standard.
    • S'il y a une erreur : celle-ci s'affiche dans la sortie d'erreurs.

    entrées et sorties d'erreur

  • Par défaut, tout s'affiche dans la console : la sortie standard comme la sortie d'erreurs. Cela explique pourquoi vous ne faisiez pas la différence entre ces 2 sorties jusqu'ici : elles avaient l'air identiques.
  • On pourrait souhaiter "logger" les erreurs dans un fichier d'erreurs à part pour ne pas les oublier et pour pouvoir les analyser ensuite. Pour cela, on utilise l'opérateur 2>. Vous avez bien lu : c'est le chiffre 2 collé au chevron que nous avons utilisé tout à l'heure.
  • Parfois, on n'a pas envie de séparer les informations dans 2 fichiers différents. Heureusement, il est possible de fusionner les sorties dans un seul et même fichier. Comment ?
    Il faut utiliser le code suivant :
    2>&1
    Cela a pour effet de rediriger toute la sortie d'erreurs dans la sortie standard.
    Traduction pour l'ordinateur :
    "envoie les erreurs au même endroit que le reste".
    Nous pouvons aussi écrire :
    2> fichier >>fichier
    (Nous pouvons mettre plusieurs redirections sur une même commande.)
  • Nous avons découvert 3 symboles :
    • 2> : redirige les erreurs dans un fichier (s'il existe déjà il sera écrasé).
    • 2>> : redirige les erreurs à la fin d'un fichier (s'il n'existe pas, il sera créé).
    • 2>&1 : redirige les erreurs au même endroit et de la même façon que la sortie standard.

    multiples erreurs

Tubes de communication ou tuyaux ou « pipes »

Le pipe | n'est pas un symbole qu'on a l'habitude d'écrire. Pourtant, il y en a forcément un sur votre clavier (parfois représenté sous la forme d'une ligne verticale en pointillés). Sur un clavier AZERTY français par exemple, vous pouvez l'écrire en combinant les touches Alt Gr + 6, et sur un clavier belge Alt Gr + 1. Sur un clavier Mac, c'est Alt + Shift + L

  • Dans la console, tout transite dans des "tuyaux" bien précis. Jusqu'ici, nous n'avions jamais manipulé ces fameux tuyaux et nous avons laissé les choses se faire par défaut : les résultats s'affichaient le plus souvent dans la console.
  • Désormais, vous allez être capables de rediriger le résultat non pas dans la console mais vers un fichier ou encore dans une autre commande. Vous pourrez ainsi manipuler ce résultat pour le transférer de commande en commande et ainsi obtenir le résultat précis que vous souhaitiez, en réalisant une "chaîne de commandes".

    redirections

  • En gros, tout ce qui sort de la commande1 est immédiatement envoyé à la commande2. Et vous pouvez chaîner des commandes comme cela indéfiniment !
    Cette fonctionnalité est vraiment une des plus importantes et elle décuple littéralement les possibilités offertes par la console. Parfois, l'utilité de certaines commandes seules peut paraître limitée, mais celles-ci prennent en général tout leur sens lorsqu'on les combine à d'autres commandes.
  • Ainsi dans l'exemple suivant, la sortie standard de la commande ls -al est envoyée sur le programme sort chargé de trier le résultat par ordre alphabétique :
    ls -al | sort
  • Il est possible de cette façon de chaîner un certain nombre de commandes par tubes successifs. Dans l'exemple suivant la commande affiche tous les fichiers du répertoire courant, sélectionne les lignes contenant le mot "zip" (grâce à la commande grep) et compte le nombre de lignes total :
    ls -l | grep zip | wc -l
    (ça marche qu'avec les commandes dont nous pouvons rediriger la sortie.)
  • Vous devriez être en mesure d'effectuer un bon nombre d'expériences après avoir lu ce résumé.
  • Ce type de commandes ne devrait donc plus vous faire peur :
    sudo grep log -Ir /var/log | cut -d : -f 1 | sort | uniq > loglist 2>&1
    C'est à la portée de tout le monde : lisez et vous comprendrez cette ligne. :-)

Exemples

  • Vous avez un fichier qui s'appelle "notes.cvs"

    1 Fabrice,18 / 20,Excellent travail
    2 Mathieu,3 / 20,Nul comme d'hab
    3 Sophie,14 / 20,En nette progression
    4 Mélanie,9 / 20,Allez presque la moyenne !
    5 Corentin,11 / 20,Pas mal mais peut mieux faire
    6 Albert,20 / 20,Toujours parfait
    7 Benoît,5 / 20,En grave chute

    Avec cut, on peut récupérer les noms. Avec sort, on peut les trier par ordre alphabétique. Pourquoi ne pas connecter cut à sort pour avoir la liste des noms triés ?

    $ cut -d , -f 1 notes.csv | sort
    Albert
    Benoît
    Corentin
    Fabrice
    Mathieu
    Mélanie
    Sophie

    Le pipe effectue la connexion entre la sortie de cut (des noms dans le désordre) et l'entrée de sort.>

    exemple de pipe avec "notes.cvs"

    On peut même aller plus loin et écrire cette liste triée dans un fichier :
    cut -d , -f 1 notes.csv | sort > noms_tries.txt
  • Le résumé est simple, et c'est dans sa simplicité qu'il tire toute sa beauté et sa puissance :

    pipe

    Je vous laisse vous entraîner avec le pipe ! Essayez d'inventer des combinaisons ! :-)