Chapitre 6 : les redirections
Introduction
Les redirections sont l’une des plus importantes possibilités offerte par le shell.
Unix utilise des canaux d’entrées/sorties pour lire et écrire ses données. Par défaut le canal d’entrée est le clavier, et le canal de sortie, l’écran. Un troisième canal, le canal d’erreur, est aussi redirigé vers l’écran.
Il est donc possible de rediriger ces canaux vers des fichiers, ou du flux texte de manière transparente pour les commandes Unix.
En sortie
On se sert du caractère > pour rediriger la sortie standard (celle qui va normalement sur écran). On indique ensuite le nom du fichier où seront placés les résultats de sortie.
$ ls -l > resultat.txt
$ cat resultat.txt
total 1
-rw-r--r-- 1 Administ ssh_user 0 Jul 4 12:04 TOTO
-rw-r--r-- 1 Administ ssh_user 0 Jul 25 15:13 resultat.txt
-rw-r--r-- 1 Administ ssh_user 171 Jul 25 15:13 test.txt
Si le fichier n’existe pas, il sera créé. S’il existe, son contenu sera écrasé, même si la commande tapée est incorrecte. Le shell commence d’abord par créer le fichier puis exécute ensuite la commande.
Pour rajouter des données à la suite du fichier, donc sans l’écraser, on utilise la double redirection >>. Le résultat est ajouté à la fin du fichier.
$ ls -l > resultat.txt
$ date >> resultat.txt
$ cat resultat.txt
total 1
-rw-r--r-- 1 Administ ssh_user 0 Jul 4 12:04 TOTO
-rw-r--r-- 1 Administ ssh_user 0 Jul 25 15:13 resultat.txt
-rw-r--r-- 1 Administ ssh_user 171 Jul 25 15:13 test.txt
Thu Jul 25 15:20:12 2002
En entrée
Les commandes qui attendent des données ou des paramètres depuis le clavier peuvent aussi en recevoir depuis un fichier, à l’aide du caractère <. Un exemple avec la commande wc qui permet de compter le nombre de lignes, de mots et de caractères d’un fichier.
$ wc < resultat.txt
4 29 203
Les canaux standards
- Le canal d’entrée standard se nomme stdin et porte le descripteur 0.
- Le canal de sortie standard se nomme stdout et porte le descripteur 1.
- La canal d’erreur standard se nomme stderr et porte le descripteur 2.
On peut rediriger les canaux de sortie 1 et 2 vers un autre fichier.
$ rmdir dossier2
rmdir: 'dossier2': No such file or directory
$ rmdir dossier2 2>error.log
$ cat error.log
rmdir: 'dossier2': No such file or directory
On peut aussi rediriger les deux canaux de sortie dans un seul et même fichier, en les liant. On utilise pour cela le caractère >&. Il est aussi important de savoir dans quel sens le shell interprète les redirections. Les redirections étant en principe en fin de commande, le shell recherche d’abord les caractères <, >, >> en fin de ligne. Ainsi si nous voulons grouper les deux canaux de sortie et d’erreur dans un même fichier, il faut procéder comme suit.
$ ls -l > resultat.txt 2>&1
La sortie 2 est redirigée vers la sortie 1, donc les messages d’erreurs passeront par la sortie standard. Puis le résultat de la sortie standard de la commande ls est redirigé vers le fichier resultat.txt. Ce fichier contiendra donc à la fois la sortie standard et la sortie d’erreur.
On peut aussi utiliser à la fois les deux types de redirection.
$ wc < resultat.txt > compte.txt
$ cat compte.txt
4 29 203
On peut aussi se reporter à la commande tee qu’on voit plus loin dans le chapitre 8.
Filtre : définition
Un filtre (ou une commande filtre) est un programme sachant écrire et lire des données par les canaux standards d’entrée et de sortie. Il en modifie ou traite éventuellement le contenu. wc est un filtre.
Nous nous attarderons sur quelques filtres plus tard, mais en voici quelques uns : more (affiche les données page par page), sort (tri des données), grep (critères de recherche)
Pipelines / tubes
Les redirections d’entrée/sortie telles que nous venons de les voir permettent de rediriger les résultats vers un fichier. Ce fichier peut ensuite être réinjecté dans un filtre pour en extraire d’autres résultats. Cela oblige à taper deux lignes : une pour la redirection vers un fichier, l’autre pour rediriger ce fichier vers le filtre. Les tubes ou pipes permet de rediriger directement le canal de sortie d’une commande vers le canal d’entrée d’une autre. Le caractère permettant cela est |.
$ ls -l > resultat.txt
$ wc < resultat.txt
devient
$ ls -l | wc
Il est possible de placer plusieurs « | » sur une même ligne.
$ ls -l | wc | wc
1 3 24
La première commande n’est pas forcément un filtre. L’essentiel est qu’un résultat soit délivré. Idem pour la dernière commande qui peut par exemple être une commande d’édition ou d’impression. Enfin, la dernière commande peut elle-même faire l’objet d’une redirection en sortie.
$ ls -l | wc > resultat.txt