Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

Comment utiliser les redirections d’entrée, sortie et pipe de Linux

La redirection des entrées-sorties est l’une des plus importantes fonctionnalités du shell Linux qui a donné à la ligne de commande Linux sa flexibilité et la possibilité d’exister encore après toutes ces années.

Les redirections des entrées/sorties et pipe sont un concept basé sur l’efficacité pour collecter et traiter des données volumineuses, vérifier et configurer les fichiers système, et aussi ajouter des données à un fichier existant ou à un nouveau fichier. Le terme de redirection signifie qu’un flux de données est redirigé d’un ou plusieurs processus vers un fichier ou un autre processus.

Dans ce tutoriel je vous guide dans le concept des redirections d’entrée et de sortie et comment utiliser ces redirections sur Linux.

Comment utiliser les redirections d'entrée, sortie et pipe de Linux

Qu’est-ce qu’une redirection ?

Les redirections sont en fait un mécanisme de communication inter-processus fourni par Linux pour permettre aux programmes (processus) et aux fichiers de communiquer entre eux, en transférant la sortie d’un programme/fichier vers l’entrée d’un autre programme/fichier.

Dans Linux, les redirections sont matérialisées par des opérateurs < >.
L’opérateur de redirection est essentiellement un tampon ou un bloc de données qui ont deux descripteurs de fichiers ; l’un est utilisé pour la lecture, et l’autre pour l’écriture.
Comme mentionné dans le paragraphe précédent, les symboles <> sont les opérateurs de redirection ; le symbole supérieur à > est utilisé pour envoyer la sortie d’un programme (processus) vers un fichier en entrée.
De l’autre, le symbole inférieur à < est utilisé pour envoyer la sortie d’un fichier à un programme (processus) en entrée.

  • La sortie standard utilisant le symbole > : la sortie de l’opérande de gauche est envoyée à l’opérande de droite, donc l’opérande de droite prend l’entrée à partir de l’extrémité de lecture du symbole >.
  • Sortie standard utilisant le symbole < : La sortie de l’opérande de droite est envoyée à l’opérande de gauche, donc l’opérande de gauche prend l’entrée de l’extrémité d’écriture du symbole <.
Sortie standard > Entrée standard
Entrée standard < Sortie standard

Ce qui nous donne :

  • commande < fichier d'entrée : Lit un fichier entrée
  • commande > fichier de sortie : Créer/Ecrit un fichier en sortie
  • commande >> fichier de sortie : Modifier un fichier en sortie

Vous trouverez plus d’explications avec des exemples plus bas ce guide.

Stdin, stdout et stderr

Lorsque vous exécutez une commande Linux, il y a trois flux de données qui jouent un rôle dans cette commande :

  • L’entrée standard (stdin) est la source des données d’entrée. Par défaut, stdin est tout texte saisi au clavier. Son ID de flux est 0.
  • La sortie standard (stdout) est le résultat de la commande. Par défaut, elle est affichée à l’écran. Son ID de flux est 1.
  • L’erreur standard (stderr) est le message d’erreur (le cas échéant) produit par les commandes. Par défaut, stderr est également affiché à l’écran. Son ID de flux est 2.
Les entrées stdin, sortie stdout et erreur standard stderr
Entrée/Sortie Fichier Numéro Description
STDIN /dev/stdin 0 Entrée Standard (Standard Input)
En général le clavier
STDOUT /dev/stdout 1 Sortie Standard (Standard output)
En général l’écran
STDERR /dev/stdout 2 Standard error
Les entrées et sorties Stdin, stdout et stderr de Linux

Les flux de sorties comportent des numéros.
Lorsque vous utilisez le symbole de redirection de sortie >, il signifie en fait 1>. En d’autres termes, vous dites que le flux de données avec l’ID 1 est sorti ici.

Lorsque vous devez rediriger le stderr, vous utilisez son ID comme 2> ou 2>>. Cela signifie que la redirection de sortie concerne le flux de données stderr (ID 2).

A retenir :

  • Il existe trois flux de données. Un flux d’entrée, stdin (0) et deux flux de données de sortie, stdout (1) et stderr (2)
  • Le clavier est le périphérique stdin par défaut et l’écran est le périphérique de sortie par défaut
  • La redirection de la sortie est utilisée avec > ou >> (pour le mode append)
  • La redirection des entrées est utilisée avec <. Le stderr peut être redirigé à l’aide de 2> ou 2>>
  • Le stderr et le stdout peuvent être combinés en utilisant 2>&1

Comment utiliser la redirection de sortie dans Linux

Rediriger la sortie standard vers un fichier

La redirection de la sortie stdout d’une commande vers un fichier se fait de la manière suivante :

commande > fichier
Comment utiliser la redirection de sortie dans Linux

Par exemple pour rediriger le résultat de la commande ls vers un fichier sortie.txt :

ls > sortie.txt
Comment utiliser la redirection de sortie dans Linux

Le fichier de sortie vers lequel le stdout est redirigé est créé avant l’exécution de la commande prévue. Pourquoi ? Parce qu’il faut que la destination de sortie vers laquelle la sortie sera envoyée soit prête.
Si le fichier est déjà existant alors cela va écraser son contenu (clobber).
Si vous désirez modifier le contenu du fichier, il faut doubler l’opérateur > :

ls >> sortie.txt
Comment utiliser la redirection de sortie dans Linux

La sortie de la commande va s’ajouter à la fin du fichier.

Rediriger l’entrée standard vers un fichier

Vous pouvez utiliser la redirection stdin pour transmettre le contenu d’un fichier texte à une commande comme celle-ci :

commande < fichier
Comment utiliser la redirection de sortie dans Linux

Ce n’est pas que la redirection stdin soit complètement inutile. Certaines commandes en dépendent. Prenez la commande tr par exemple. Cette commande peut faire beaucoup de choses, mais dans l’exemple ci-dessous, elle convertit le texte d’entrée des minuscules en majuscules :

tr a-z A-Z < fichier.txt

En fait, il est conseillé d’utiliser stdin plutôt que pipe, notamment pour éviter l’utilisation inutile de la commande cat.

Par exemple, beaucoup de personnes utiliseraient l’exemple ci-dessus avec cat et ensuite utiliseraient tr sur celui-ci. Franchement, il n’y a pas besoin d’utiliser cat ici.

cat fichier.txt | tr a-z A-Z
Comment utiliser la redirection de sortie dans Linux

Voici un autre exemple où on envoie la sortie de fichier.txt à la commande head.

head < fichier.txt
cat fichier.txt|head

La boucle while du shell Linux utilise aussi la redirection d’entrée.
Ci-dessous, la boucle while lit ligne par ligne le contenu du fichier “entree.file” envoyé en entrée.

while read -r ligne;
do
   echo "$ligne" ;
done < entree.file

Comment utiliser les redirections d’erreur (stderr) sur Linux

Rediriger la sortie standard d’erreur vers un fichier

Dans Linux, les commandes retournent des messages d’erreurs lorsqu’elle ne parvienne pas à effectuer l’action demandée.
Par exemple, si vous lister un fichier qui n’existe pas avec ls, ce dernier retourne un message d’erreur :

ls kikoolol.txt
ls: impossible d'accéder à 'kikoolol.txt': Aucun fichier ou dossier de ce type

Cette erreur s’affiche dans une sortie spécifique nommée stderr.

Il est tout à fait possible de rediriger la sortie standard d’erreur Linux vers un fichier.
Pour cela, on utilise l’opérateur 2>.
Par exemple ci-dessous, on redirige le message d’erreur vers erreur.txt

ls kikoolol.txt 2> erreur.txt
cat erreur.txt 
ls: impossible d'accéder à 'kikoolol.txt': Aucun fichier ou dossier de ce type
Comment utiliser les redirections d'erreur (stderr) sur Linux

On peut combiner une redirection de la sortie standard et de la sortie d’erreur dans une même commande.
Voici comment faire :

ls -l demo.txt kikoolol.txt > sortie.txt 2> erreur.txt
cat sortie.txt 
-rw-rw-r-- 1 mak mak 7 sept.  9 13:22 demo.txt
cat erreur.txt 
ls: impossible d'accéder à 'kikoolol.txt': Aucun fichier ou dossier de ce type
Comment utiliser les redirections d'erreur (stderr) sur Linux

Dans l’exemple ci-dessus, la commande ls essaie d’afficher deux fichiers.
Pour un fichier, elle obtient un succès et pour l’autre, elle obtient une erreur. Donc ce que j’ai fait ici est de rediriger le stdout vers ouput.txt (avec >) et le stderr vers erreur.txt (avec 2>).

La redirection 2>&1 de Linux

Une autre façon, et c’est celle qui est préférée, est d’utiliser l’opérateur 2>&1.
Ce qui peut être traduit grossièrement par “rediriger stderr vers la même adresse que stdout”.

Reprenons l’exemple précédent et utilisons cette fois-ci 2>&1 pour rediriger stdout et stderr vers le même fichier.

ls -l demo.txt kikoolol.txt > sortie.txt 2>&1
cat sortie.txt 
ls: impossible d'accéder à 'kikoolol.txt': Aucun fichier ou dossier de ce type
-rw-rw-r-- 1 mak mak 7 sept.  9 13:22 demo.txt

Gardez à l’esprit que vous ne pouvez pas utiliser 2>>&1 en pensant l’utiliser en mode append. 2>&1 passe déjà en mode append.

Comment utiliser les redirections d'erreur (stderr) sur Linux

Vous pouvez également utiliser 2> en premier et ensuite utiliser 1>&2 pour rediriger stdout vers le même fichier que stderr. En fait, c’est “>&” qui redirige un flux de données vers un autre.

Comment utiliser la redirections entre les commandes avec pipe

Un pipe sous Linux (tube) est simplement une barre verticale sur votre clavier. Il est utilisé pour considérer la commande qui se trouve à sa gauche comme une entrée pour la commande qui se trouve à sa droite.
Avec la redirection par pipe, vous envoyez la sortie standard d’une commande vers l’entrée standard d’une autre commande.

commande1 | commande2 | commande3
Comment utiliser la redirections entre les commandes avec pipe

Par exemple, on liste les fichiers texte avec la commande ls puis on envoie le résultat à la commande wc qui va compter le nombre de ligne données par ls.
Ensuite on redirige le résultat de la commande wc dans le fichier compter.txt.
Cela permet donc de compatibiliser le nombre de fichier texte dans un dossier.

ls *.txt | wc -l > compter.txt
Comment utiliser la redirections entre les commandes avec pipe
IMPORTANT : Pour que cela fonctionne, il faut que la commande prenne en compte son entrée standard.
Ce n’est pas le cas de toutes les commandes.

Par exemple cette utilisation de la commande find qui recherche tous les fichiers txt puis tente de les passer à la commande mv ne fonctionnera pas.
Pourquoi ? car la commande mv ne tient pas compte de son entre standard.

find . -type f -name "*.txt" | mv dossier_destination/

La solution est d’utiliser l’option -exec de find :

find . -type f -name "*.txt" -exec mv dossier_destination/ \;

Mais on peut aussi utiliser la commande xargs.
Celle-ci prend des jetons (délimités par des caractères d’espacement s’il n’y a pas d’indication contraire) à partir de son flux d’entrée standard et les ajoute comme paramètres à la ligne de commande d’une autre commande à exécuter. Dans notre cas, la commande ls donnée à xargs reçoit un ensemble de noms de chemins sur sa ligne de commande et effectue sa tâche sur eux comme documenté par le manuel.

L’article Comment utiliser les redirections d’entrée, sortie et pipe de Linux est apparu en premier sur malekal.com.

Enregistrer un commentaire

0 Commentaires