Programmation Bash/Flux et redirections
Un livre de Wikibooks.
Sections |
[modifier] Descripteurs de flux
Sous les systèmes Unix, chaque processus possède 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 |
[modifier] Boîte à outils redirectionnels
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 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.
[modifier] cat tautologique
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. $
[modifier] Redirection de la sortie standard
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 >>.
[modifier] Redirection de la sortie d'erreur standard
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
[modifier] Concaténation dans un fichier
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
[modifier] Tubes
Un tube permet de rediriger la sortie standard d'une commande vers l'entrée standard d'une autre commande.
commande1 | commande2
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 "pipe" grep *conf |
[modifier] Résumé des outils de redirection
com > ficredirige la sortie standard decomdans le fichierfic,com 2> ficredirige la sortie des erreurs decomdans le fichierfic,com 2>&1redirige la sortie des erreurs decomvers la sortie standard decom,com < ficredirige l'entrée standard decomdans le fichierfic,com1 | com2redirige la sortie standard de la commandecom1vers l'entrée standard decom2.

