Redirections et pipes
Rediriger les sorties vers un fichier et relier des commandes avec un pipe.
Objectifs
À la fin de cette leçon, vous saurez :
- rediriger la sortie d'une commande vers un fichier avec
>et>>; - lire une entrée depuis un fichier avec
<; - relier deux commandes avec un pipe
|; - comprendre la notion d'entrée et de sortie standard.
🔗 Pour vous rafraîchir la mémoire : lecture de fichiers et aide (
cat,grep,man)
Préambule : les canaux d'une commande
Chaque commande possède trois canaux standards :
stdin (entrée standard, clavier par défaut)
stdout (sortie standard, écran par défaut)
stderr (erreur standard, écran par défaut)
Quand un programme « affiche », il écrit sur stdout. Quand il veut communiquer une erreur, il écrit sur stderr. Ces canaux peuvent être redirigés : c'est la clé de tout ce qui suit.
Rediriger la sortie vers un fichier
ls -la > liste.txt
Le résultat n'apparaît pas à l'écran : il part dans liste.txt. Testez :
cat liste.txt
Le > écrase le fichier s'il existe déjà. Le >> ajoute à la fin :
ls -la >> liste.txt
Là, le contenu précédent est conservé, et la nouvelle sortie lui est ajoutée.
Point de vigilance :
>et>>portent sur stdout. Les messages d'erreur continuent d'aller à l'écran, sauf si on redirige aussi stderr avec2>, ce qui n'est pas nécessaire pour le niveau actuel.
Rediriger l'entrée depuis un fichier
cat < liste.txt
< fait lire cat depuis le fichier au lieu du clavier. Le résultat semble identique à cat liste.txt, mais les opérations ne sont pas les mêmes : dans un cas, cat reçoit le nom du fichier en argument ; dans l'autre, son entrée standard est remplacée par le fichier. À ce stade, retenez l'idée : le canal d'entrée peut être changé.
Le pipe : relier des commandes
Le pipe | connecte la sortie standard d'une commande à l'entrée standard de la suivante :
cat fichier.txt | grep "erreur"
ls -la / | head -n 10
L'interprétation :
cat fichier.txtproduit un texte sur stdout ;- ce texte devient stdin de
grep, qui conserve seulement les lignes contenant « erreur » ; - le résultat, encore une fois stdout, est affiché par défaut à l'écran.
Le pipe n'est pas magique : c'est juste la connexion physique de deux programmes.
Enchaîner des commandes
On peut aussi les enchaîner dans une même ligne :
cd /tmp && touch test.txt # exécuter la 2e seulement si la 1re réussit
ls /tmp || echo "échec de lecture" # exécuter la 2e seulement si la 1re échoue
head -n 2 /etc/hosts ; date # toujours exécuter les deux
&&: la suite dépend du succès (code de retour 0) ;||: la suite s'exécute en cas d'échec ;;: enchaînement pur, sans condition.
Exercice
- Redirigez la liste de
/homedansmaison.txtet affichez-la. - Redirigez la liste de
/etcen ajoutant àmaison.txt, puis affichez la taille des deux fichiers avecwc -l. - En employant uniquement deux commandes et un pipe, affichez les 4 premières commandes de
/usr/bin. - Utilisez un pipe pour compter le nombre de fichiers visibles dans le répertoire courant.
- Écrivez une commande qui ajoute la ligne « Fait : vérifié » à la fin d'un fichier du nom de votre choix, sans ouvrir d'éditeur, puis relisez le fichier.
Résumé
- Trois canaux : entrée standard, sortie standard, erreur standard.
>écrase,>>ajoute ; un fichier est un canal de sortie comme un autre.- Un pipe
|relie sortie d'une commande et entrée d'une autre. &&,||et;enchaînent selon le résultat ou inconditionnellement.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Exercice 1.
ls -la /home > maison.txt
cat maison.txt
Exercice 2.
ls -la /etc >> maison.txt
wc -l maison.txt
Le total est bien la somme des deux listes : la première entrée est dans le fichier, la seconde s'y est ajoutée.
Exercice 3.
ls /usr/bin | head -n 4
Exercice 4.
ls | wc -l
ls -a | wc -l compterait aussi .. et . : la différence est instructive ! Sans options, ls ignore les deux entrées cachées.
Exercice 5.
echo "Fait : vérifié" >> carnet.txt
cat carnet.txt
>> plutôt que > : on crée le fichier s'il est absent, on ajoute s'il existe déjà. Sans la redirection, le texte serait resté à l'écran ; grâce à elle, il est écrit dans le fichier.