| Linux-Mandrake: Manuel de référence | ||
|---|---|---|
| Page précédente | Chapitre 2. Introduction à la ligne de commande | Page suivante |
Pour comprendre le principe des redirections et des tubes, nous avons besoin d'expliquer une notion sur les processus qui n'a pas encore été introduite. Chaque processus sous Unix (y compris les applications graphiques) ouvre un minimum de trois descripteurs de fichiers : l'entrée standard, la sortie standard et le canal d'erreur standard. Leurs numéros respectifs sont 0, 1 et 2. En général, ces trois descripteurs sont associés au terminal depuis lequel le processus a été lancé, l'entrée standard étant lue depuis le clavier. Le but des redirections et des tubes est de rediriger ces descripteurs. Les exemples dans cette section vont vous aider à mieux comprendre.
Supposons par exemple que vous vouliez connaître la liste des fichiers se terminant par .gif[1] dans le répertoire images, mais cette liste est très longue, vous avez donc intérêt à la stocker dans un fichier pour la consulter à loisir ensuite. Vous pouvez alors taper ceci :
ls images/*.gif 1>liste_fichiers
Ce qui signifie que la sortie standard de cette commande (1) est redirigée (>) vers le fichier de nom liste_fichiers. L'opérateur > est l'opérateur de redirection de sortie. Si le fichier de redirection n'existait pas, il est créé, mais s'il existait son ancien contenu sera écrasé. Cependant, par défaut, le descripteur redirigé par cet opérateur est la sortie standard, il n'est pas besoin de le spécifier sur la ligne de commande. Vous pouvez donc écrire plus simplement :
ls images/*.gif >liste_fichiers
et le résultat sera exactement le même. Vous pouvez ensuite consulter le fichier à l'aide d'un visualisateur de fichiers texte tel que less.
Supposons maintenant que vous vouliez savoir le nombre de ces fichiers. Au lieu de compter à la main, vous utilisez le bien nommé wc (Word Count, compter les mots) avec l'option -l, qui écrit sur la sortie standard le nombre de lignes du fichier. Une solution est la suivante :
wc -l 0<liste_fichiers
et cela donne le résultat voulu. L'opérateur < est l'opérateur de redirection d'entrée, et de même le descripteur redirigé par défaut est celui de l'entrée standard, donc 0, et la ligne s'écrit simplement :
wc -l <liste_fichiers
Supposons maintenant que vous vouliez consulter cette liste en retirant toutes les « extensions » des fichiers et mettre le résultat dans un autre fichier. Un outil pour se faire est sed, pour Stream EDitor (éditeur de flux). Il suffit de rediriger l'entrée standard de sed vers le fichier liste_fichiers et de rediriger sa sortie vers le fichier résultat, par exemple la_liste :
sed -e 's/\.gif$//g' <liste_fichiers >la_liste
et voilà votre liste créée, que vous pouvez de même consulter à loisir avec un visualisateur.
Il peut aussi s'avérer utile de rediriger l'erreur standard. Par exemple, vous voulez savoir quels répertoires dans /shared ne vous sont pas accessibles : une solution est de lister récursivement ce répertoire et de rediriger les erreurs vers un fichier, tout en n'affichant pas le canal de sortie standard :
ls -R /shared >/dev/null 2>erreurs
ce qui signifie que la sortie standard sera redirigée (>) vers /dev/null, fichier spécial dans lequel tout ce qu'on écrit est perdu (donc par effet de bord la sortie standard n'est pas affichée) et que le canal d'erreur standard (2) est redirigé (>) vers le fichier erreurs.
Les tubes (pipes en anglais) sont en quelque sorte une combinaison des redirections d'entrée et de sortie. Son principe est celui d'un tube même, d'où son nom : un processus envoie des données dans le tube par un bout et un autre processus lit les données par l'autre bout. L'opérateur tube est |. Reprenons l'exemple de la liste des fichiers ci-dessus. Supposons que vous vouliez savoir directement le nombre de fichiers correspondants sans avoir à stocker la liste dans un fichier temporaire, vous utiliserez alors la commande suivante :
ls images/*.gif | wc -l
ce qui signifie que la sortie standard de la commande ls (donc la liste des fichiers) est redirigée vers l'entrée standard de la commande wc. Vous obtenez donc le résultat désiré.
Vous pouvez de même construire directement la liste des fichiers « sans les extensions » avec la commande suivante :
ls images/*.gif | sed -e 's/\.gif$//g' >la_liste
ou, si vous voulez consulter directement la liste sans la stocker dans un fichier :
ls images/*.gif | sed -e 's/\.gif$//g' | less
Les tubes et les redirections ne sont pas limités au seul texte lisible par les humains. Ainsi, la commande suivante, lancée à partir d'un xterm :
xwd -root | convert - ~/mon_bureau.gif
fera une capture d'écran de votre bureau dans le fichier intitulé mon_bureau.gif[2] dans votre répertoire personnel.
| [1] | Il peut vous paraître saugrenu de dire « les fichiers se terminant par .gif » plutôt que « les images GIF ». Mais, encore une fois, les fichiers sous Unix n'ont d'extension que par convention : une extension ne détermine en aucun cas le type d'un fichier. Un fichier se terminant par .gif peut très bien être une image JPEG, un exécutable, un fichier texte ou n'importe quoi d'autre. |
| [2] | Oui, ce sera bien une image GIF :-) |
| Page précédente | Début | Page suivante |
| Motifs d'englobement du shell, expressions rationnelles | Remonter | Le complètement |