# Programmation Bash/Flux et redirections

* Introduction
* Hello World
* Notions essentielles du shell bash
* Interactions avec le système de fichiers
* Flux et redirections
* Tests
* Calculs
* Structures conditionnelles
* Boucles
* Interactions avec l'utilisateur
* Regex
* Fonctions
* Scripts
* Enchaînements et scripts
* Liste des commandes
* Commandes ksh
* Problèmes connus
* Introduction
* Hello World
* Notions essentielles du shell bash
* Interactions avec le système de fichiers
* Flux et redirections
* Tests
* Calculs
* Structures conditionnelles
* Boucles
* Interactions avec l'utilisateur
* Regex
* Fonctions
* Scripts
* Enchaînements et scripts
* Liste des commandes
* Commandes ksh
* Problèmes connus
[ Modifier le sommaire ]

## En Bash

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

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

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

## 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 :
Souvent, dans les scripts bash, on utilise l'astuce suivante pour créer un fichier texte dynamiquement :
Pour ajouter du contenu à un fichier, il suffit d'utiliser >>.

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

## 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 :

## Tubes

Un tube permet de rediriger la sortie standard d'une commande vers l'entrée standard d'une autre commande.
ou pour connecter en plus la sortie d'erreur de la commande1 sur l'entrée de la 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 | grep "conf$"

## Résumé des outils de redirection

* 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