Programmation Bash/Flux et redirections
En Bash
modifierChaque 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
modifierLes 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 utilise2>
. - < 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
modifierLa 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
modifierOn 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
modifierLa 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
modifierPar 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
Tubes
modifierUn 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
modifiercom > fic
redirige la sortie standard decom
dans le fichierfic
,com 2> fic
redirige la sortie des erreurs decom
dans le fichierfic
,com 2>&1
redirige la sortie des erreurs decom
vers la sortie standard decom
,com < fic
redirige l'entrée standard decom
dans le fichierfic
,com1 | com2
redirige la sortie standard de la commandecom1
vers l'entrée standard decom2
.com1 |& com2
branche ("connecte" selon le manuel bash) la sortie standard et la sortie d'erreur decom1
sur l'entrée decom2