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
liste.txt
contenant la sortie de la commandels
.
Pour visualiser ce fichier :cat liste.txt
ouless liste.txt
ougedit 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
liste.txt
. -
commande < fichier
Le contenu du fichier est envoyé à la commandecat < liste.txt
liste.txt
est redirigé vers la commandecat
qui l'affiche. -
commande1 | commande2
La sortie de lacommande1
est redirigé vers l'entrée de lacommande2
.ls -1 ~ | wc -l
wc
qui en compte le nombre de lignes.
Redirection par l'expérimentation
Création et concaténation par redirection
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
- Dans le terminal lancer la commande :
tty
- Lancer un autre terminal et tapez la commande
tty
. - 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
La redirection ne fonctionne pas toujours ?
Si le fichiertoto
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.
À 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.