Redirections et gestion du flux avec Bash

De nombreuses commandes Bash retournent un résultat. Par défaut, le résultat retourné va être affiché directement dans le Terminal. Souvent, nous voudrons plutôt faire en sorte que le résultat d’une commande soit stocké dans un fichier ou réutilisé pour une autre commande. Nous allons pouvoir faire cela en utilisant des redirections d’entrée et de sortie.

Avant tout, vous devez savoir que chaque commande est associée à trois flux :

  1. L’entrée standard (ou « input » ou encore stdin) qui correspond à l’entrée 0 ;
  2. La sortie standard (ou « output » ou encore stdout) qui correspond à l’entrée 1 ;
  3. 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”.

Redirection de la sortie standard d'une commande shell bash avec >

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 >>.

Redirection de la sortie standard d'une commande shell bash avec >>

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.

Redirection de la sortie d'erreur standard d'une commande shell bash

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.

Redirection de l'entrée standard d'une commande shell bash

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 :

Redirection de l'entrée et de la sortie standard d'une commande shell bash

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 :

Redirection de commandes avec bash

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

CommandeDé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

Laisser un commentaire