Tous les programmes démarrent avec 3 canaux d’entrée-sorties déjà ouverts. Ce sont:
- 0 (stdin) : entrée normale, généralement le clavier
- 1 (stdout): sortie normale, généralement l’écran
- 2 (stderr): sortie des messages d’erreur, généralement l’écran
bash nous permet de rediriger ces canaux vers les entrée-sorties qui correspondent à nos besoins. Trois caractères spéciaux ( <>| ) sont utilisés. Supposons le programme unProg:
unProg < fichier # utiliser un fichier au lieu du clavier unProg > fichier # rediriger la sortie vers un fichier (le vider d'abord) unProg >> fichier # rediriger la sortie vers un fichier (ajouter au fichier) unProg | autreProg # rediriger la sortie vers un autre programme
Un exemple:
cat fichier | wc -l # afficher le nombre de lignes du fichier
Le programme cat affiche le contenu d’un fichier mais, dans ce cas-ci, sa sortie n’ira pas vers l’écran mais plutôt vers le programme wc -l qui compte le nombre de ligne dans le texte entré. Dans ce cas-ci, l’entrée de wc n’est pas le clavier mais, à cause de la redirection, c’est plutôt la sortie du programme précédent.
La forme générale d’une redirection de fichier est n> ou n< où n est le numéro du canal d’entrée-sortie. Donc:
unProg 2> fichier_erreurs
redirige le canal 2 (les messages d’erreurs) vers un fichier. On aura compris que > (sans numéro de canal) est une abréviation de 1>.
Fusion de flux
La formulation n>&m permet de fusionner le canal n avec le canal m
Donc. la commande unProg > fichierX 2>&1 signifie:
- envoyer la sortie normale vers fichierX
- fusionner le canal2 (erreurs) et le canal1 (sortie normale)
Notez que l’évaluation se fait de gauche à droite et que, par conséquent, la commande unProg 2>&1 >fichierX ne dirige pas les messages d’erreur vers fichierX
Autres exemples:
prog 1> fich1 2>fich2 # rediriger les canaux 1 et 2 prog 2> /dev/null # diriger la sortie d'erreur vers la poubelle
Note: il ne faut pas insérer d’espace entre les caractères de n> ou n>&m
Dans le cas d’une redirection vers un programme, on ne peut pas spécifier les canaux; c’est toujours 1 vers 0 (sortie normale vers l’entrée). Si c’est vraiment nécessaire, il y a, bien sur, une façon de diriger 2 (les erreurs) vers l’entrée:
unProg 3>&1 1>&2 2>&3 | autreProg # on permute 1 et 2