Avant tout, vous devez savoir que chaque commande est associée à trois flux :
- L’entrée standard (ou « input » ou encore stdin) qui correspond à l’entrée 0 ;
- La sortie standard (ou « output » ou encore stdout) qui correspond à l’entrée 1 ;
- La sortie d’erreur standard (stderr) qui correspond à l’entrée 2.
Sortie standard et redirection
La plupart des commandes qui renvoient un résultat vont le faire via l’entée 1. Par défaut, la sortie standard dirige le résultat vers l’affichage courant (le Terminal). On peut utiliser un chevron fermant >
pour demander à la sortie standard de diriger le résultat vers un fichier en utilisant la syntaxe suivante : commande > mon_fichier.txt
. Ici, le résultat de la commande “commande” sera dirigé vers le fichier “mon_fichier.txt”.
Dans l’exemple ci-dessus, on redirige le résultat d’une commande ls
(qui permet d’afficher les différents éléments d’un répertoire) dans un fichier qu’on appelle « test.txt » et qui se situe sur notre bureau.
Faites bien attention à un point : lorsque vous utilisez >
, le résultat qui va être stocké dans le fichier va remplacer le contenu précédent du fichier. Pour ajouter le résultat après le contenu déjà présent dans le fichier, nous utiliserons plutôt un double chevron >>
.
Notez également que si le fichier de redirection mentionné n’existe pas, il sera automatiquement créé.
Sortie d’erreur standard et redirection
La sortie d’erreur standard gère l’affichage des erreurs qui peuvent être renvoyées lorsqu’une commande ne peut pas pour une raison ou pour une autre effectuer son travail (mauvaise syntaxe de notre part, etc.).
Par défaut, la sortie standard redirige les messages d’erreur vers l’affichage courant, ce qui signifie que les erreurs vont être affichées directement dans le Terminal pour nous.
On voudra parfois cacher les erreurs aux utilisateurs car certaines erreurs peuvent contenir des informations sensibles ou ne vont pas être pertinentes pour l’utilisateur. Dans ces cas là, on va pouvoir rediriger la sortie standard vers un fichier en utilisant la syntaxe commande 2> mon_fichier
ou commande 2>> mon_fichier
comme précédemment.
Notez que le “2” représente la sortie d’erreur standard. Les numéros sont utiles ici pour permettre de différencier les différentes entrées. Les entiers 0, 1 et 2 sont appelés des descripteurs de fichiers.
On va également pouvoir rediriger la sortie d’erreur standard vers la sortie standard de la commande avec la syntaxe commande 2>&1
. Cela peut être intéressant dans le cas où on a défini précédemment une redirection pour la sortie standard.
Entrée standard et redirection
La plupart des commandes acceptent des données entrantes qui vont leur indiquer quoi faire depuis ce qu’on appelle l’entrée standard. Par défaut, l’entrée standard récupère les données à partir du clavier. Là encore, nous allons pouvoir rediriger l’entrée standard afin qu’elle accepte des données enregistrées dans des fichiers. Pour cela, nous allons cette fois-ci utiliser un chevron ouvrant <
comme ceci : commande < mon_fichier.txt
.
Ici, on passe le contenu de notre fichier « test.txt » en entrée à la commande sort
dont le rôle est de trier des données par ordre alphabétique par défaut et de renvoyer le résultat.
Bien évidemment, rien ne nous empêche de rediriger à la fois l’entrée et la sortie standard :
Ici, on passe notre fichier « test.txt » à la commande sort
et on redirige son résultat vers un autre fichier qu’on appelle « ls_trie.txt ».
Connecter plusieurs commandes entre elles
La redirection du résultat d’une commande vers un fichier plutôt que vers l’affichage courant n’est pas le seul type de redirection que nous puissions faire avec Bash. Nous allons également en effet pouvoir directement injecter le résultat d’une commande dans une autre commande. Cette fonctionnalité est très utile et très puissante. Pour faire cela, nous allons simplement utiliser une barre verticale |
entre nos différentes commandes.
On va par exemple pouvoir passer le résultat d’une commande ls -l
à une commande sort
en une ligne comme cela :
Note : la redirection de commandes comme ci-dessus ressemble dans l’idée à la substitution de commande vue dans la leçon précédente. Cependant, les procédés mis en place ne sont pas les mêmes et le langage ne traite pas ces deux opérations de la même façon. Les concepts utilisés ici sont relativement spécifiques et complexes à comprendre et nous n’en parlerons donc pas davantage dans ce cours.
Tableau récapitulatif sur les redirections
Commande | Définition |
---|---|
C > f |
Exécute la commande “C” et redirige sa sortie standard dans le fichier “f” en écrasant son contenu ou en le créant s’il n’existe pas |
C >> f |
Exécute la commande C et redirige sa sortie standard à la fin du fichier f |
C 2> f |
Exécute la commande C et redirige sa sortie d’erreur standard vers le fichier f en écrasant son contenu ou en créant f s’il n’existe pas |
C 2>> f |
Exécute la commande C et redirige sa sortie standard des erreurs à la fin de f |
C 2>&1 |
Exécute la commande C et redirige sa sortie standard des erreurs dans sa sortie standard |
C < f |
Exécute la commande C en passant le contenu de f dans son entrée standard |
C1 | C2 |
Exécute la commande C1 et injecte son résultat (le contenu de sa sortie standard) dans l’entrée standard de la commande C2 |