Programmation Bash/Flux et redirections

En Bash

modifier

Chaque application lancée en Bash a les flux d'entrée/sortie (stdin, stdout, stderr) que lui confère l'environnement bash (cf man : ENVIRONNEMENT D'EXÉCUTION DES COMMANDES), en plus des flux stocké (fichier) ou en transit(ex : tube nommé)

Sous les systèmes Unix, chaque processus possédera trois descripteurs de flux :

  • l'entrée standard, qui permet d'envoyer des données au programme,
  • la sortie standard, qui est utilisée pour afficher les résultats d'un programme,
  • la sortie standard des erreurs, qui permet d'afficher les messages correspondant aux erreurs survenues lors de l'exécution du programme.

Par défaut les deux flux de sortie sont envoyés sur le terminal de l'utilisateur (écran) et l'entrée prend ses données depuis le clavier. Tout comme avec les fichiers standards, il est possible de lire (sortie) et d'écrire (entrée) sur les descripteurs de flux.


Exemple  : descripteurs de flux d'un processus


Boîte à outils redirectionnels

modifier

Les trois flux standards peuvent être redirigés vers d'autres sources autres que le clavier ou l'écran. Par exemple, on peut ordonner à un processus de diriger sa sortie standard vers un fichier. Pour cela, les numéros des descripteurs de flux sont utilisés. Les outils pour réaliser ces redirections sont les suivants :

  • > redirige le flux de sortie de la commande pour la placer dans un fichier. Par défaut, si rien n'est précisé, le flux redirigé est la sortie standard, i.e. > est équivalent à 1>. Pour rediriger la sortie d'erreur standard, on utilise 2>.
  • < redirige le flux d'entrée de la commande pour la prendre dans un fichier,
  • | redirige la sortie standard de la commande de gauche sur l’entrée standard de la commande de droite,
  • >> redirige le flux de sortie de la commande pour l’ajouter à la fin d’un fichier existant.

cat tautologique

modifier

La commande cat recopie l'entrée standard sur la sortie standard. Pour quitter cette commande, utiliser la combinaison de touches CTRL D. Par exemple :

$ cat 
je pense
je pense
donc
donc
je suis
je suis

Par défaut, cat prend ses données en entrée ligne par ligne. Ce qui explique qu'à chaque fois que l'on tape entrée, les caractères inscrits sur l'entrée standard via le clavier sont recopiés sur la sortie standard. Cette commande peut prendre un fichier comme entrée standard. Exemple :

$ cat monfichier
Affichage du contenu de mon fichier.
$

Redirection de la sortie standard

modifier

On peut utiliser cat pour créer un fichier texte rapidement, en utilisant la redirection de la sortie standard vers un fichier. Exemple :

$ cat > journal
Voici les premières lignes de mon journal.
Riches de sens, elles sont le fruit d'un intense travail.
$ cat journal
Voici les premières lignes de mon journal.
Riches de sens, elles sont le fruit d'un intense travail.

Souvent, dans les scripts bash, on utilise l'astuce suivante pour créer un fichier texte dynamiquement :

$ cat <<FIN > fichier
Ce fichier contient des données très importantes.
Son contenu est généré dynamiquement via un script.
cat cesse d'enregistrer lorsque les caractères stipulant la fin sont donnés à l'entrée standard. 
Dans ce cas, il s'agit de  :
FIN
$ cat fichier  
Ce fichier contient des données très importantes.
Son contenu est généré dynamiquement via un script.
cat cesse d'enregistrer lorsque les caractères stipulant la fin sont donnés à l'entrée standard. 
Dans ce cas, il s'agit de  :
$

Pour ajouter du contenu à un fichier, il suffit d'utiliser >>.

Redirection de la sortie d'erreur standard

modifier

La bonne gestion des messages d’erreur est une des clés de la réussite d’un script. Il est possible de collecter proprement ces messages grâce à la redirection. Lorsqu'on lance la commande cat sur un fichier qui n'existe pas, on obtient un message d'erreur No such file or directory. On peut vérifier que ce message est un bien un message d'erreur en redirigeant la sortie d'erreur standard vers un fichier.

$ cat toto
cat: toto: No such file or directory
$ cat toto 2>erreur.log
$ ls
erreur.log
$ cat erreur.log 
cat: toto: No such file or directory


Concaténation dans un fichier

modifier

Par défaut, lorsque l'on redirige la sortie standard d'un processus dans un fichier, ce fichier est écrasé par le nouveau contenu. Dans le cas d'un journal d'erreur, ceci peut s'avérer fâcheux, car la journalisation est écrasée à chaque nouveau message. Pour concaténer un message au contenu existant d'un fichier, on utilise >>. En poursuivant l'exemple du paragraphe précédent, on obtient  :

$ cat titi 2>>erreur.log
$ cat erreur.log 
cat: toto: No such file or directory
cat: titi: No such file or directory



Un tube permet de rediriger la sortie standard d'une commande vers l'entrée standard d'une autre commande.

commande1 | commande2

ou pour connecter en plus la sortie d'erreur de la commande1 sur l'entrée de la commande2:

commande1 |& command2

La commande suivante ls|grep "conf$" liste le contenu d'un répertoire et ne sélectionne que les fichiers dont le nom se termine par conf. La figure suivante illustre la redirection de la sortie standard de ls (la liste des fichiers d'un répertoire) vers l'entrée standard de la commande grep.

Illustration  : Tube Unix de la commande ls | grep "conf$"

Résumé des outils de redirection

modifier
  • com > fic redirige la sortie standard de com dans le fichier fic,
  • com 2> fic redirige la sortie des erreurs de com dans le fichier fic,
  • com 2>&1 redirige la sortie des erreurs de com vers la sortie standard de com,
  • com < fic redirige l'entrée standard de com dans le fichier fic,
  • com1 | com2 redirige la sortie standard de la commande com1 vers l'entrée standard de com2.
  • com1 |& com2 branche ("connecte" selon le manuel bash) la sortie standard et la sortie d'erreur de com1 sur l'entrée de com2