TP8 – Redirection des entrées sorties

Introduction

L'objectif de ce TP est de manipuler la redirection des flux d'entrée et de sortie des commandes dans un terminal et de les enchaîner à l'aide de tubes (ou " pipes" en anglais).

Trois différents « fichiers » sont toujours ouverts par défaut, stdin (le clavier), stdout (l'écran) et stderr (la sortie des messages d'erreur vers l'écran). Ceux-ci, et n'importe quel autre fichier ouvert, peuvent être redirigés. La redirection signifie simplement la capture de la sortie d'un fichier, d'une commande, d'un programme, d'un script et le renvoi du flux comme entrée d'un autre fichier, commande, programme ou script.

Références

Outils pour la redirection

Les redirections s'écrivent avec les caractères >, < et | (appelé tube ou pipe ).

En voici leur utilisation basique :

  • commande > fichier
    Redirige la sortie de la commande ( stdout) vers un fichier
    exemple :
    ls -la > liste.txt
    crée le fichier liste.txt contenant la sortie de la commande ls.
    Pour visualiser ce fichier : cat liste.txt ou less liste.txt ou gedit liste.txt, etc.
  • commande >> fichier
    Même chose, mais concatène la sortie au contenu du fichier (plutôt que de le remplacer)
     ls -la > liste.txt
     ls >> liste.txt
    La sortie des deux commandes se retrouve dans liste.txt.
  • commande < fichier
    Le contenu du fichier est envoyé à la commande
    cat < liste.txt
    Le contenu de liste.txt est redirigé vers la commande cat qui l'affiche.
  • commande1 | commande2
    La sortie de la commande1 est redirigé vers l'entrée de la commande2.
    ls -1 ~ | wc -l
    Envoie la liste des dossiers et fichiers de la racine utilisateur sur une colonne dans la commande wc qui en compte le nombre de lignes.

Redirection par l'expérimentation

Création et concaténation par redirection

Expérimentez
 echo Bonjour
 echo Bonjour > sortie.txt
 cat sortie.txt
 Bonjour
 echo ça va ? >> sortie.txt
 cat sortie.txt
 Bonjour
 ça va ?
 ls -l ~ > ls.txt

Téléportation d'un terminal à l'autre

  1. Dans le terminal lancer la commande :
    tty
    qui indique le chemin du terminal courant.
  2. Lancer un autre terminal et tapez la commande tty.
  3. Dans le premier terminal, rediriger des commandes vers le second terminal, en utilisant son chemin :
    echo Bonjour > /dev/pts/X
    ls -l > /dev/pts/X
    tree ~ > /dev/pts/X
    Toutes les sorties sont redirigées vers le nouveau terminal (!) qui est vu comme un fichier.

La redirection ne fonctionne pas toujours ?

Si le fichier toto n'existe pas, la commande suivante affiche une erreur :
 rm toto
 rm: impossible de supprimer «toto»: Aucun fichier ou dossier de ce type

Supprimons ce message d'erreur en redirigeant sa sortie vers un fichier erreur.txt

rm toto > erreur.txt

Surprise, le message est toujours affiché !

Il y a deux flux de sortie ! La sortie standard et la sortie d'erreur.

Pour rediriger la sortie d'erreur, il faut spécifier le canal du flux à rediriger qui est le canal 2 ( 1 pour la sortie standard) :

rm toto 2> erreur.txt

Cette fois-ci les erreurs sont bien enregistrées dans le fichier erreur.txt.

À noter que echo Bonjour > sortie.txt est équivalent à echo Bonjour 1> sortie.txt (canal 1 par défaut)

Redirection des erreurs dans un "trou noir" : /dev/null

rm toto 2> /dev/null

et le message d'erreur disparaît sans être stocké sur le disque.

Tubes

Les tubes (ou " pipes ") servent à rediriger la sortie d'une commande vers l'entrée d'une autre.

Intérêt des tubes par l'exemple

Combien y a-t-il d'exécutables dans /usr/bin ?

Première solution : compter ce qu'affiche la commande suivante :

ls /usr/bin

Beaucoup de fichiers n'est-ce pas ?!

La commande wc -l compte le nombre de ligne dans un fichier

Comptons le nombre d'exécutables en deux étapes en passant par un fichier intermédiaire ( lignes.txt) :

 ls -1 /usr/bin > lignes.txt
 wc -l < lignes.txt

Nous pouvons aboutir au même résultat en une étape à l'aide d'un tube :

ls -1 /usr/bin | wc -l

sans nécessiter de stockage temporaire dans un fichier.

Utilisation de filtres de flux

Il existe de nombreuses commandes pour filtrer les flux d'entrée/sortie : tr, sort, grep, cut, uniq, etc.

Expérimentez

À titre d'illustration, copiez les lignes suivantes dans un fichier telephone.txt :

Durand;Emilie;0381818585
Terieur;Alex;0478858069
Terieur;Alain;0563868985
Dupond;Albert;04961868957
Dupont;Emilie;02971457895
Dupond;Albertine;0131986258
Bistrukla;César;0381698759
Zeblues;Agathe;0685987456
Dupond;Agnes;0687598614
Assin;Marc;04661645987
Dupond;Elisabeth;0654896325
Houtand;Laurent;0658769458
Dalor;Omer;0694258746
Deuf;John;0699999999 

Vous pouvez le faire avec les redirections :

cat > telephone.txt

et coller les lignes dans le terminal. Faites un ctrl-d pour terminer.

Vérifiez que le fichier est bien rempli :

cat telephone.txt

Compter le nombre de mots :

 cat telephone.txt | wc -w
 13

il y a pourtant plus de mots, mais wc ne considère pas le caractère ' ;' comme un séparateur de mots.

En utilisant la commande tr ( translate) pour traduire les ' ;' en ' ' on compte le bon nombre de mots :

cat telephone.txt
cat telephone.txt | tr ';' ' '
cat telephone.txt | tr ';' ' ' | wc -w

Le TP suivant portera sur le filtrage des entrés/sorties.