Show 011.html syntax highlighted
<HTML><HEAD><TITLE>Linux-Mandrake: Guide de l'utilisateur et Manuel de référence</TITLE>
<LINK REV=MADE HREF="mailto:info@mandrakesoft.com"></HEAD>
<BODY BGCOLOR="#ffffff"><center><font size="+5"><STRONG><table border="0"><tr><td><STRONG>Linux-Mandrake</STRONG>:</td></tr><tr><td>Guide de l'utilisateur</td></tr><tr><td>et Manuel de référence</td></tr></table></STRONG></font>
<p><font size="+2"><STRONG><table border="0"><tr><td><STRONG>MandrakeSoft</STRONG></td></tr></table></STRONG></font>
<p><STRONG><table border="0"><tr><td> </td></tr><tr><td> </td></tr><tr><td>Janvier 2000</td></tr><tr><td><CODE>http://www.linux-mandrake.com</CODE></td></tr><tr><td></td></tr></table></STRONG></center>
<hr><a href="012.html">Suivant : L'édition de texte: <STRONG>Emacs</STRONG> et <STRONG>VI</STRONG></a><br><a href="010.html">Précédent : Où obtenir de la documentation</a><br><a href="../">Retour</a><br><hr><a href="000.html#toc"><font size="-1">(Retour à la table des matières)</font></a>
<H1><font size="+1"><a name="89">Chapitre 1 : Introduction à la ligne de commande</a></font></H1><hr><p>Dans le chapitre 4.0, nous avons vu comment lancer un
<EM>shell</EM> et ses principes de base, mais nous ne l'avons pas mis au
travail, et c'est ce que nous allons faire dans ce chapitre.
<p>Le principal avantage du <EM>shell</EM> est le nombre d'utilitaires
existants: il en existe des milliers, et chacun est dédié à une tâche
particulère. Nous n'en verrons qu'un petit nombre ici. L'une des grandes
forces d'<STRONG>Unix</STRONG> est la possibilité de combiner ces utilitaires,
comme nous allons le voir un peu plus tard.
<H1><a name="90">Utilitaires de manipulation de fichiers</a></H1>
<p>La manipulation de fichiers signifie ici copier, déplacer et effacer des
fichiers. Après ceci, nous verrons des manières de changer leurs
attributs (propriétaire, permissions associées).
<H2><a name="91"><CODE>mkdir</CODE>, <CODE>touch</CODE>: création de répertoires et fichiers vides (<EM>MaKe DIRectory</EM>, « créer un répertoire », « toucher »)</a></H2>
<p><CODE>mkdir</CODE> est utilisé pour créer des répertoires. Sa syntaxe est
simple:
<p><CODE>mkdir [options] <répertoire> [répertoire ...]</CODE>
<p>Une seule option est digne d'intérêt: l'option <CODE>-p</CODE>. Si cette
option est passée en argument, <CODE>mkdir</CODE> créera les répertoires
parents s'il n'existaient pas avant. Si elle ne l'est pas et que les
répertoires parents n'existent pas, <CODE>mkdir</CODE> renverra une erreur.
Exemples:
<ul><li><STRONG><CODE>mkdir toto</CODE></STRONG>: crée un répertoire du nom de <CODE>toto</CODE>
dans le répertoire courant.
<li><STRONG><CODE>mkdir -p images/divers docs</CODE></STRONG>: crée un répertoire
<CODE>divers</CODE> dans le répertoire <CODE>images</CODE> en créant ce dernier
auparavant s'il n'existait pas, et crée aussi un répertoire
<CODE>docs</CODE>.</ul>
<p>Initialement, la commande <CODE>touch</CODE> n'a pas pour but de créer des
fichiers mais de mettre à jour les temps d'accès et de
modification<a name="bodynote3" href="026.html#note3">[3]</a>. Toutefois, l'un
de ses effets de bord est de créer les fichiers mentionnés s'ils
n'existaient pas déjà. La syntaxe est:
<p><CODE>touch [options] fichier [fichier...]</CODE>
<p>Donc, lancer la commande:
<p><CODE>touch fichier1 images/fichier2</CODE>
<p>créera un fichier appelé <CODE>fichier1</CODE> dans le répertoire courant et
un fichier appelé <CODE>fichier2</CODE> dans le répertoire <CODE>images</CODE>.
<H2><a name="92"><CODE>rm</CODE>: supprimer des fichiers ou des répertoires (<EM>ReMove</EM>, « ôter »)</a></H2>
<p>Cette commande joue le rôle des <CODE>del</CODE> et <CODE>deltree</CODE> du
<STRONG>DOS</STRONG>, et plus encore. Sa syntaxe est:
<p><font size="-2"><PRE>
rm [options] <fichier|répertoire> [fichier|répertoire...]
</PRE></font>
<p>Parmi les options, on trouve:
<ul><li><STRONG><CODE>-r</CODE> ou <CODE>-R</CODE></STRONG>: Supprimer récursivement. Cette option
est <EM>obligatoire</EM> pour supprimer un répertoire, même vide.
Toutefois, il existe aussi la commande <CODE>rmdir</CODE> pour effacer des
répertoires vides.
<li><STRONG><CODE>-i</CODE></STRONG>: Demander confirmation avant chaque effacement. Il
est recommandé de placer un <STRONG>alias</STRONG> de <CODE>rm</CODE> vers
<CODE>rm-i</CODE> dans votre <EM>shell</EM>, et de même pour les commandes
<CODE>cp</CODE> et <CODE>mv</CODE>.
<li><STRONG><CODE>-f</CODE></STRONG>: Le contraire de <CODE>-i</CODE>, force la suppression
des fichiers ou répertoires, même si l'utilisateur n'a pas
d'autorisation en écriture sur les fichiers<a name="bodynote4" href="026.html#note4">[4]</a>.</ul>
<p>Quelques exemples:
<ul><li><STRONG><CODE>rm -i images/*.jpg fichier1</CODE></STRONG>: Supprimer tous les
fichiers dont le nom se termine par <CODE>.jpg</CODE> dans le répertoire
<CODE>images</CODE> ainsi que le fichier <CODE>fichier1</CODE> dans le répertoire
courant, en demandant confirmation pour chacun des fichiers. Répondez
<CODE>'o'</CODE> ou <CODE>'y'</CODE> pour confirmer, <CODE>'n'</CODE> pour annuler.
<li><STRONG><CODE>rm -Rf images/divers/ file*</CODE></STRONG>: Suppression sans demande de
confirmation de tout le répertoire <CODE>divers/</CODE> dans le répertoire
<CODE>images/</CODE> en plus de tous les fichiers du répertoire courant dont
le nom commence par <CODE>file</CODE>.</ul>
<blockquote>Attention: un fichier effacé avec <CODE>rm</CODE> est effacé de façon
<EM>irrévocable</EM>. Il n'y a aucun moyen de récupérer les fichiers!
N'hésitez donc pas à utiliser l'option <CODE>-i</CODE>...</blockquote>
<H2><a name="93"><CODE>mv</CODE>: déplacer ou changer le nom des fichiers (<EM>MoVe</EM>, « déplacer »)</a></H2>
<p>La syntaxe de la commande <CODE>mv</CODE> est la suivante:
<p><font size="-2"><PRE>
mv [options] <fichier|rép.> [fichier|rép...] <destination>
</PRE></font>
<p>Quelques options:
<ul><li><STRONG><CODE>-f</CODE></STRONG>: Forcer le déplacement de fichiers --- aucun
avertissement en cas d'écrasement d'un fichier au cours de l'opération.
<li><STRONG><CODE>-i</CODE></STRONG>: Le contraire --- demander confirmation à
l'utilisateur avant d'écraser un fichier existant.
<li><STRONG><CODE>-v</CODE></STRONG>: Mode <STRONG>verbeux</STRONG>, rapporter tous les changements.</ul>
<p>Quelques exemples:
<ul><li><STRONG><CODE>mv -i /tmp/pics/*.gif .</CODE></STRONG>: Déplacer tous les fichiers du
répertoire <CODE>/tmp/pics/</CODE> dont le nom se termine par <CODE>.gif</CODE>
vers le répertoire courant (<CODE>.</CODE>), en demandant confirmation avant
d'écraser un fichier existant.
<li><STRONG><CODE>mv toto titi</CODE></STRONG>: <STRONG>Renommer</STRONG> le fichier <CODE>toto</CODE>
en <CODE>titi</CODE>.
<li><STRONG><CODE>mv -vf fichier* images/ trash/</CODE></STRONG>: Déplacer, sans demander
confirmation, tous les fichiers dans le répertoire courant dont le nom
commence par <CODE>fichier</CODE> ainsi que tout le répertoire
<CODE>images/</CODE> vers le répertoire <CODE>trash/</CODE>, et rapporter tous les
changements effectués.</ul>
<H2><a name="94"><CODE>cp</CODE>: copier des fichiers et des répertoires (<EM>CoPy</EM>, « copier »)</a></H2>
<p><CODE>cp</CODE> est un remplacement pour les commandes <CODE>copy</CODE>,
<CODE>xcopy</CODE> de <STRONG>DOS</STRONG> et plus. Sa syntaxe est la suivante:
<p><font size="-2"><PRE>
cp [options] <fichier|rép.> [fichier|rép...] <destination>
</PRE></font>
<p>Il existe une myriade d'options. Voici les plus utilisées:
<ul><li><STRONG><CODE>-R</CODE></STRONG>: Copier récursivement; <EM>obligatoire</EM> pour
copier un répertoire, même vide.
<li><STRONG><CODE>-i</CODE></STRONG>: Demander confirmation avant d'écraser des fichiers
qui pourraient l'être.
<li><STRONG><CODE>-f</CODE></STRONG>: Le contraire de <CODE>-i</CODE>, remplacer d'éventuels
fichiers existants sans demander confirmation.
<li><STRONG><CODE>-v</CODE></STRONG>: Mode verbeux, rapporter toutes les actions effectuées
par <CODE>cp</CODE>.</ul>
<p>Quelques exemples:
<ul><li><STRONG><CODE>cp -i /tmp/images/* images/</CODE></STRONG>: Copier tous les fichiers
du répertoire <CODE>/tmp/images</CODE> dans le répertoire <CODE>images/</CODE> du
répertoire courant, en demandant confirmation si un fichier peut être
écrasé.
<li><STRONG><CODE>cp -vR docs/ /shared/mp3s/* mystuff/</CODE></STRONG>: Copie tout le
répertoire <CODE>docs</CODE> dans le répertoire courant plus tous les fichiers
dans le répertoire <CODE>/shared/mp3s</CODE> dans le répertoire <CODE>mystuff</CODE>
situé dans le répertoire courant.
<li><STRONG><CODE>cp toto titi</CODE></STRONG>: Faire une copie du fichier <CODE>toto</CODE>
sous le nom de <CODE>titi</CODE> dans le répertoire courant.</ul>
<H1><a name="95">Manipulation des attributs de fichiers</a></H1>
<p>La série de commandes présentée ici est utilisée pour changer le
propriétaire ou groupe propriétaire d'un fichier ou ses droits d'accès.
Nous avons vu les différents droits d'accès dans le
chapitre 4.0.
<H2><a name="96"><CODE>chown</CODE>, <CODE>chgrp</CODE>: changer l'utilisateur et le groupe propriétaires d'un ou plusieurs fichiers (<EM>CHange OWNer</EM>, « changer de propriétaire »; <EM>CHange GRouP</EM>) « changer de groupe »</a></H2>
<p>La syntaxe de la commande <CODE>chown</CODE> est la suivante:
<p><font size="-4"><PRE>
chown [options] <utilisateur[.groupe]> <fichier|rép.> [fichier|rép...]
</PRE></font>
<p>Entre autres options, on trouve:
<ul><li><STRONG>option-R</STRONG>: Récursif; changer le propriétaire de tous les
fichiers et sous-répertoires d'un répertoire donné.
<li><STRONG><CODE>-v</CODE></STRONG>: Mode verbeux; décrit toutes les actions effectuées
par <CODE>chown</CODE>; rapporte quels fichiers ont changé de propriétaire à
la suite de la commande et lesquels n'ont pas changé.
<li><STRONG><CODE>-c</CODE></STRONG>: Comme <CODE>-v</CODE>, mais ne rapporte que les fichiers
pour lesquels un changement a eu lieu.</ul>
<p>Quelques exemples:
<ul><li><STRONG><CODE>chown nobody /shared/book.tex</CODE></STRONG>: Changer le propriétaire
du fichier <CODE>/shared/book.tex</CODE> en <CODE>nobody</CODE>.
<li><STRONG><CODE>chown -Rc jean.musique *.mid concerts/</CODE></STRONG>: Donner la
propriété de tous les fichiers dans le répertoire courant se terminant
par <CODE>.mid</CODE> et de tous les fichiers et sous-répertoires du
répertoire <CODE>concerts/</CODE> à <CODE>jean</CODE> et au groupe <CODE>musique</CODE>,
en ne rapportant que les fichiers affectés par la commande.</ul>
<p>La commande <CODE>chgrp</CODE> ne vous laisse changer que le groupe
propriétaire d'un fichier ou d'un groupe de fichiers; sa syntaxe est
très semblable à celle de la commande <CODE>chown</CODE>:
<p><font size="-2"><PRE>
chgrp [options] <groupe> <fichier|rép.> [fichier|rép...]
</PRE></font>
<p>Les options de cette commande sont les mêmes que pour <CODE>chown</CODE>,
et elle est utilisée de façon très similaire. Ainsi, la commande:
<p><CODE>chgrp disk /dev/hd*</CODE>
<p>attribue au groupe <CODE>disk</CODE> tous les fichiers du répertoire
<CODE>/dev</CODE> dont le nom commence par <CODE>hd</CODE>.
<H2><a name="97"><CODE>chmod</CODE>: changer les permissions sur des fichiers et des répertoires (<EM>CHange MODe</EM>, « changer le mode »)</a></H2>
<p>La commande <CODE>chmod</CODE> a une syntaxe bien particulière. La syntaxe
générale est:
<p><font size="-3"><PRE>
chmod [options] <changement de mode> <fichier|rép.> [fichier|rép...]
</PRE></font>
<p>mais ce qui la distingue, ce sont les différentes formes que peut
prendre le changement de mode. Il peut être spécifié de deux façons:
<ul><li>en octal; les droits d'accès de l'utilisateur propriétaire
correspondent alors à des chiffres de la forme <CODE><x>00</CODE>, où
<CODE><x></CODE> correspond au droit assigné: 4 pour lecture, 2 pour
écriture, 1 pour exécution; de même, les droits d'accès du groupe
propriétaire sont de la forme <CODE><x>0</CODE> et ceux des
« <STRONG>autres</STRONG> » sont de la forme <CODE>x</CODE>. Tout ce qui
reste alors à faire est d'additionner ensemble les droits d'accès
assignés pour obtenir le bon chiffre. Ainsi, les permissions
<CODE>rwxr-xr--</CODE> correspondent à 400+200+100 (droits d'accès de
l'utilisateur propriétaire,<CODE>rwx</CODE>) +40+10 (droits d'accès du
groupe, <CODE>r-x</CODE>) +4 (droits d'accès des autres, <CODE>r--</CODE>) =
754; de cette façon, les droits d'accès sont exprimés de manière
absolue: les droits d'accès précédents sont remplacés
inconditionnellement.
<li>avec des expressions: les droits d'accès sont ici exprimés par une
suite d'expressions séparées par des virgules, une expression étant de
la forme <CODE>[catégorie]<+|-><droits d'accès></CODE>. La catégorie peut être
une combinaison de <CODE>u</CODE> (pour <EM>user</EM>,
« utilisateur »), <CODE>g</CODE> (pour
<EM>Group</EM>, « groupe ») ou <CODE>o</CODE>
(<EM>Others</EM>, « les autres »). Si aucune
catégorie n'est spécifiée, le changement s'applique à toutes les
catégories. Un <CODE>+</CODE> appose un droit d'accès et un <CODE>-</CODE> le
retire. Pour finir, les droits d'accès sont l'un de <CODE>r</CODE> (pour
<EM>Read</EM>, « lecture »), <CODE>w</CODE> (pour
<EM>Write</EM>, « écriture ») ou <CODE>x</CODE>
(pour <EM>eXecute</EM>, « exécution »).</ul>
<p>Les options principales sont très similaires à celles de <CODE>chown</CODE>
ou <CODE>chgrp</CODE>:
<ul><li><STRONG><CODE>-R</CODE></STRONG>: Changer les droits d'accès récursivement.
<li><STRONG><CODE>-v</CODE></STRONG>: Mode verbeux, décrire les actions effectuées pour
chaque fichier.
<li><STRONG><CODE>-c</CODE></STRONG>: Comme <CODE>-v</CODE> mais ne rapporte que les fichiers
dont les droits d'accès ont changé.</ul>
<p>Exemples:
<ul><li><STRONG><CODE>chmod -R o-w /shared/docs</CODE></STRONG>: Enlever de façon récursive
le droit d'accès en écriture aux « autres » sur tous les fichiers
et sous-répertoires du répertoire <CODE>/shared/docs/</CODE>.
<li><STRONG><CODE>chmod -R og-w,o-x prive/</CODE></STRONG>: Enlever de façon récursive
le droit d'accès en écriture pour le groupe et les autres sur tout le
répertoire <CODE>prive/</CODE>, et retire le droit d'accès en exécution pour
les autres.
<li><STRONG><CODE>chmod -c 644 divers/fichier*</CODE></STRONG>: Changer les droits
d'accès de tous les fichiers du répertoire <CODE>divers/</CODE> dont les noms
commencent par <CODE>fichiers</CODE> en <CODE>rw-r--r--</CODE> (droit d'accès
en lecture pour tout le monde et droit d'accès en écriture pour le
propriétaire du fichier seulement), et ne rapporter que les fichiers
affectés par l'opération.</ul>
<H1><a name="98">Motifs d'englobement du <EM>shell</EM> et <STRONG>expressions rationnelles</STRONG></a></H1>
<p>Vous utilisez sans doute déjà des caractères d'<STRONG>englobement</STRONG> sans
le savoir. Quand vous enregistrez un fichier dans une application sous
<STRONG>Windows</STRONG>, quand vous recherchez un fichier, vous utilisez
<CODE>*</CODE> pour désigner une suite de caractères quelconque. Par
exemple, <CODE>*.txt</CODE> désigne l'ensemble des fichiers dont le nom se
termine par <CODE>.txt</CODE>. Nous l'avons également beaucoup utilisé dans
la section précédente. Mais l'englobement va beaucoup plus loin que le
seul <CODE>*</CODE>.
<p>Quand vous tapez une commande comme <CODE>ls *.txt</CODE> et tapez
<CODE>Entrée</CODE>, la tâche de trouver quels fichiers correpondent au motif
<CODE>*.txt</CODE> n'est pas du ressort de <CODE>ls</CODE>, mais par le
<EM>shell</EM> lui-même. Cela requiert une petite explication sur la
façon dont le <EM>shell</EM> interprète une ligne de commande. Quand vous
tapez:
<p><font size="+2"><PRE>
$ ls *.txt
readme.txt recettes.txt
</PRE></font>
<p>la ligne de commande est tout d'abord séparée en mots (<CODE>ls</CODE> et
<CODE>*.txt</CODE> en l'occurrence). Quand le <EM>shell</EM> voit le
<CODE>*</CODE> dans un des mots, il interprète le mot comme étant un motif
englobant et le remplace dans la ligne de commande par les noms de tous
les fichiers correspondant au motif. La ligne juste avant exécution par
le shell est donc devenue <CODE>ls readme.txt recettes.txt</CODE>, ce qui
donne le résultat recherché. Le <EM>shell</EM> réagit aussi à la vue
d'autres caractères:
<ul><li><STRONG><CODE>?</CODE></STRONG>: correspond à un et un seul caractère, quel qu'il
soit;
<li><STRONG><CODE>[...]</CODE></STRONG>: correspond à un des caractères entre les
crochets; les caractères peuvent être désignés en intervalles (par
exemple, <CODE>1-9</CODE>) ou des valeurs <STRONG>discrètes</STRONG>, ou un mélange
des deux. Exemple: <CODE>[a-zBE5-7]</CODE> correspond à tous les
caractères de <CODE>a</CODE> à <CODE>z</CODE>, un <CODE>B</CODE>, un <CODE>E</CODE>,
un <CODE>5</CODE>, un <CODE>6</CODE> ou un <CODE>7</CODE>;
<li><STRONG><CODE>[!...]</CODE></STRONG>: correspond à tous les caractères qui ne se
trouvent <EM>pas</EM> entre les crochets; <CODE>[!a-z]</CODE>, par exemple,
correspond à tout caractère qui n'est pas une lettre minuscule;
<li><STRONG><CODE>c1,c2</CODE></STRONG>: correspond à <CODE>c1</CODE> ou <CODE>c2</CODE>, où
<CODE>c1</CODE> et <CODE>c2</CODE> sont eux-même des motifs d'englobement.</ul>
<p>Voici quelques exemples de motifs et leurs significations:
<ul><li><STRONG><CODE>/etc/*conf</CODE></STRONG>: Tous les fichiers du répertoire <CODE>/etc</CODE>
dont le nom se termine par <CODE>conf</CODE>. Cela peut correspondre au
fichier
<CODE>/etc/inetd.conf</CODE>, mais aussi à <CODE>/etc/conf.linuxconf</CODE>, et à
<CODE>/etc/conf</CODE> si un tel fichier existe. Souvenez-vous que <CODE>*</CODE>
peut correspondre à une chaîne vide.
<li><STRONG><CODE>image/cars,space[0-9]/*.jpg</CODE></STRONG>: Tous les fichiers dont
le nom se termine par <CODE>.jpg</CODE> dans les répertoires
<CODE>image/cars</CODE>, <CODE>image/space0</CODE>, ... , <CODE>image/space9</CODE>, s'ils
existent.
<li><STRONG><CODE>/usr/doc/*/README</CODE></STRONG>: Tous les fichiers de nom
<CODE>README</CODE> dans tous les sous-répertoires immédiats de
<CODE>/usr/doc</CODE>. Cela correspondra à <CODE>/usr/doc/mandrake/README</CODE> par
exemple, mais pas à <CODE>/usr/doc/myprog/doc/README</CODE>.
<li><STRONG><CODE>*[!a-z]</CODE></STRONG>: Tous les fichiers du répertoire courant dont
le nom ne finit pas par une lettre minuscule.</ul>
<H1><a name="99">Redirections et tubes</a></H1>
<H2><a name="100">Un peu plus sur les processus</a></H2>
<p>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 <STRONG>Unix</STRONG> (y compris les
applications graphiques) ouvre un minimum de trois descripteurs de
fichiers: l'<STRONG>entrée standard</STRONG>, la <STRONG>sortie standard</STRONG> et le
<STRONG>canal d'erreur standard</STRONG>. 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.
<H2><a name="101">Redirections</a></H2>
<p>Supposons par exemple que vous vouliez connaître la liste des fichiers
se terminant par <CODE>.gif</CODE><a name="bodynote5" href="026.html#note5">[5]</a> dans le répertoire
<CODE>images</CODE>, 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:
<p><CODE>ls images/*.gif 1>liste_fichiers</CODE>
<p>Ce qui signifie que la sortie standard de cette commande (<CODE>1</CODE>)
est redirigée (<CODE>></CODE>) vers le fichier de nom
<CODE>liste_fichiers</CODE>. L'opérateur <CODE>></CODE> 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:
<p><CODE>ls images/*.gif >liste_fichiers</CODE>
<p>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
<CODE>less</CODE>.
<p>Supposons maintenant que vous vouliez savoir le nombre de ces fichiers.
Au lieu de compter à la main, vous utilisez le bien nommé <CODE>wc</CODE>
(<EM>Word Count</EM>, « compter les mots »)
avec l'option <CODE>-l</CODE>, qui écrit sur la sortie standard le nombre de
lignes du fichier. Une solution est la suivante:
<p><CODE>wc -l 0<liste_fichiers</CODE>
<p>et cela donne le résultat voulu. L'opérateur <CODE><</CODE> 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:
<p><CODE>wc -l <liste_fichiers</CODE>
<p>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 <CODE>sed</CODE>, pour
<EM>Stream EDitor</EM> (« éditeur de flux »).
Il suffit de rediriger l'entrée standard de <CODE>sed</CODE> vers le
fichier <CODE>liste_fichiers</CODE> et de rediriger sa sortie vers le fichier
résultat, par exemple <CODE>la_liste</CODE>:
<p><CODE>sed -e 's/.gif$//g' <liste_fichiers >la_liste</CODE>
<p>et voilà votre liste créée, que vous pouvez de même consulter à loisir
avec un visualisateur.
<p>Il peut aussi s'avérer utile de rediriger l'erreur standard. Par
exemple, vous voulez savoir quels répertoires dans <CODE>/shared</CODE> 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:
<p><CODE>ls -R /shared >/dev/null 2>erreurs</CODE>
<p>ce qui signifie que la sortie standard sera redirigée (<CODE>></CODE>) vers
<CODE>/dev/null</CODE>, 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 (<CODE>2</CODE>) est redirigé (<CODE>></CODE>)
vers le fichier <CODE>erreurs</CODE>.
<H2><a name="102">Tubes</a></H2>
<p>Les tubes (<EM>pipes</EM> 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 <CODE>|</CODE>. 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:
<p><CODE>ls images/*.gif | wc -l</CODE>
<p>ce qui signifie que la sortie standard de la commande <CODE>ls</CODE> (donc
la liste des fichiers) est redirigée vers l'entrée standard de la
commande <CODE>wc</CODE>. Vous obtenez donc le résultat désiré.
<p>Vous pouvez de même construire directement la liste des fichiers
« sans les extensions » avec la commande suivante:
<p><CODE>ls images/*.gif | sed -e 's/.gif$//g' >la_liste</CODE>
<p>ou, si vous voulez consulter directement la liste sans la stocker dans
un fichier:
<p><CODE>ls images/*.gif | sed -e 's/.gif$//g' | less</CODE>
<p>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
<STRONG>xterm</STRONG>:
<p><CODE>xwd -root | convert - /mon_bureau.gif</CODE>
<p>fera une capture d'écran de votre bureau dans le fichier intitulé
<CODE>mon_bureau.gif</CODE><a name="bodynote6" href="026.html#note6">[6]</a>
dans votre répertoire personnel.
<H1><a name="103">Le complètement</a></H1>
<p>Le complètement est une fonctionnalité des plus pratiques, et tous les
<EM>shells</EM> modernes (dont <CODE>bash</CODE>) l'incluent. Son but est de
faire travailler l'utilisateur le moins possible. Le mieux pour
illustrer ce qu'est le complètement est un exemple.
<H2><a name="104">Exemple</a></H2>
<p>Supposons que vous ayez dans votre répertoire personnel un fichier
<CODE>fichier_au_nom_très_long_impossible_à_taper</CODE>, et vous
voulez le consulter. Supposons que vous ayez également dans ce même
répertoire un autre fichier appelé <CODE>fichier_texte</CODE>. Vous vous
trouvez dans votre répertoire personnel. Vous tapez alors la séquence
suivante:
<p><CODE>$ less fi<TAB></CODE>
<p>(c'est-à-dire, tapez <CODE>less fi</CODE> suivi d'une pression sur la
touche <CODE>TAB</CODE>). Le <EM>shell</EM> aura alors étendu la ligne de
commande pour vous:)
<p><CODE>$ less fichier_</CODE>
<p>et aura également marqué la liste des choix possibles (dans sa
configuration par défaut, qui peut être personnalisée). Tapez alors la
séquence de touches suivante:
<p><CODE>less fichier_a<TAB></CODE>
<p>et le <EM>shell</EM> aura étendu la ligne de commande pour obtenir le
résultat que vous souhaitiez:
<p><CODE>less fichier_au_nom_très_long_impossible_à_taper</CODE>
<p>Il ne vous reste plus alors qu'à taper sur la touche <CODE>Entrée</CODE> pour
valider et consulter le fichier.
<H2><a name="105">De façon plus générale</a></H2>
<p>La touche <CODE>TAB</CODE> n'est pas le seul moyen d'activer le complètement,
bien que ce soit la façon la plus courante de faire. De façon générale,
le mot à compléter sera un nom de commande pour le premier mot de la
ligne de commande (<CODE>nsl<TAB></CODE> donnera <CODE>nslookup</CODE>), et un
nom de fichier pour tous les autres, à moins que le mot ne soit précédé
d'un caractère « magique » parmi <CODE> </CODE>, <CODE>@</CODE> ou
<CODE>$</CODE>, auquel cas le shell essaiera de compléter respectivement un
nom d'utilisateur, un nom de machine ou une variable
d'environnement<a name="bodynote7" href="026.html#note7">[7]</a>. Il existe également
un caractère magique pour compléter un nom de commande (<CODE>!</CODE>) ou
un nom de fichier (<CODE>/</CODE>).
<p>Les deux autres façons d'activer le complètement sont les séquences
<CODE>Esc-<x></CODE> et <CODE>C-x <x></CODE> (<CODE>Esc</CODE> pour la touche <CODE>Échap</CODE>,
<CODE>C-x</CODE> voulant dire <CODE>Control</CODE>+<CODE><x></CODE>) où <CODE><x></CODE> est
l'un des caractères magiques déjà mentionnés). Taper <CODE>Esc-<x></CODE>
tentera le complètement de façon unique, et en cas d'échec complètera le
mot à la plus grande sous-chaîne possible dans la liste des choix. Un
<STRONG>bip</STRONG> signifie soit que le choix n'est pas unique, soit qu'il n'y
a tout simplement pas de choix correspondant. La séquence <CODE>C-x <x></CODE>
affichera la liste des choix possibles sans tenter aucun complètement.
La pression sur la touche <CODE>TAB</CODE> est équivalente à une pression
successive de <CODE>Esc-<x></CODE> et de <CODE>C-x <x></CODE>, le caractère magique
dépendant du contexte.
<p>Ainsi, une façon de voir toutes les variables d'environnement définies
est de taper sur une ligne vierge la séquence <CODE>C-x $</CODE>. Un autre
exemple: si on veut voir la page de manuel de la commande
<CODE>nslookup</CODE>, il suffit de taper <CODE>man nsl</CODE> puis
<CODE>Esc-!</CODE>, et le <EM>shell</EM> complétera automatiquement en
<CODE>man nslookup</CODE>.
<H1><a name="106">Lancement et manipulation de processus en arrière-plan: le <EM>job control</EM> (« contrôle des processus en arrière-plan »)</a></H1>
<p>Vous aurez remarqué que quand vous lancez une commande à partir d'un
terminal, vous devez normalement attendre que la commande soit terminée
pour que le <EM>shell</EM> vous rende la main: vous avez lancé la
commande au <STRONG>premier plan</STRONG>. Il y a des situations, cependant, où
cela n'est pas souhaitable.
<p>Supposons, par exemple, que vous ayez entrepris de copier récursivement
un gros répertoire vers un autre. Vous décidez également d'ignorer les
erreurs, donc vous redirigez le canal d'erreur vers <CODE>/dev/null</CODE>:
<p><CODE>cp -R images/ /shared/ 2>/dev/null</CODE>
<p>Une telle commande peut prendre plusieurs minutes avant de se terminer.
Vous disposez alors de deux solutions: la première, brutale, est
d'interrompre (de tuer) la commande pour la relancer plus tard, quand
vous aurez le temps. Pour ce faire, tapez <CODE>C-c</CODE>
(<CODE>Control</CODE>+<CODE>'c'</CODE>): vous reviendrez alors à l'invite.
<p>Mais vous souhaiteriez quand même que la commande s'exécute tout en
faisant autre chose. La solution est alors de mettre le processus en
<STRONG>arrière-plan</STRONG>. Pour ce faire, tapez <CODE>C-z</CODE> pour suspendre le
processus:
<p><font size="-3"><PRE>
$ cp -R images/ /shared/ 2>/dev/null
# Tapez C-z
[1]+ Stopped cp -R images/ /shared/ 2>/dev/null
$
</PRE></font>
<p>et vous revoilà devant le prompt. Le processus est alors suspendu en
attente que vous le relanciez (comme l'indique le mot-clé
<CODE>Stopped</CODE>, « arrêté »). C'est ce que vous voulez
faire, bien sûr, mais à l'arrière-plan. Tapez <CODE>bg</CODE> (pour
<EM>BackGround</EM>, « arrière-plan »), cela
aura l'effet escompté:
<p><font size="+1"><PRE>
$ bg
[1]+ cp -R images/ /shared/ 2>/dev/null &
$
</PRE></font>
<p>Le processus aura alors repris son exécution en tâche de fond, ce
qu'indique le signe <CODE>&</CODE> (esperluette) à la fin de la ligne. Vous
vous retrouvez alors en face de l'invite et pouvez continuer à
travailler. Un processus qui <STRONG>tourne</STRONG> en tâche de fond, ou
arrière-plan, est appelé un <STRONG><EM>job</EM></STRONG>.
<p>Vous pouvez bien sûr lancer directement des processus en tâche de fond,
justement en ajoutant une <CODE>'&'</CODE> à la fin de la commande. Ainsi vous
pouvez lancer la copie du répertoire en arrière-plan en écrivant:
<p><CODE>cp -R images/ /shared/ 2>/dev/null &</CODE>
<p>Si vous le souhaitez, vous pouvez également remettre ce processus au
premier plan et attendre qu'il se termine en tapant <CODE>fg</CODE> (pour
<EM>ForeGround</EM>, « premier plan »).
Répétez alors la séquence <CODE>C-z</CODE>, <CODE>bg</CODE> pour le remettre à
l'arrière-plan.
<p>Vous pouvez lancer plusieurs <EM>jobs</EM> de cette façon: chacune de
ces commandes recevra alors un numéro de <EM>job</EM>. La commande
<CODE>jobs</CODE> du <EM>shell</EM> indique la liste de tous les
<EM>jobs</EM> associés au <EM>shell</EM> courant. Le <EM>job</EM>
précédé d'un signe <CODE>+</CODE> désigne le dernier processus mis en tâche
de fond. Pour remettre au premier plan un <EM>job</EM> en particulier,
vous pourrez alors taper <CODE>fg <n></CODE> où <CODE><n></CODE> désigne le
numéro de <EM>job</EM>, par exemple <CODE>fg 5</CODE>.
<p>Notez que vous pouvez également suspendre ou lancer de cette façon des
applications <STRONG>plein écran</STRONG> (si elles sont correctement
programmées), telles que <CODE>less</CODE> ou un éditeur de texte comme
<STRONG>VI</STRONG>, et les remettre au premier plan quand vous le voulez.
<H1><a name="107">Un dernier mot</a></H1>
<p>Vous avez pu vous en rendre compte, le <EM>shell</EM> est très complet,
et l'utiliser efficacement est avant tout une question de pratique. Il
n'a été fait mention dans ce chapitre relativement long que de
quelques-unes des commandes disponibles: <STRONG>Linux-Mandrake</STRONG> comporte des
milliers d'utilitaires, et même les utilisateurs les plus expérimentés
n'en utilisent qu'une centaine au grand maximum.
<p>Il existe des utilitaires pour tous les goûts et toutes les
utilisations: vous avez des utilitaires de manipulation d'images (tels
que <CODE>convert</CODE> mentionné plus haut, mais aussi le mode
<STRONG><EM>batch</EM></STRONG> de <STRONG>GIMP</STRONG> et tous les utilitaires de
manipulation de <STRONG><EM>pixmaps</EM></STRONG>), de sons (encodeurs <EM>MP3</EM>,
lecteurs de <EM>CD</EM> audio), de gravure de <EM>CD-ROM</EM>, des programmes de
courrier électronique, des clients <EM>FTP</EM> et même des navigateurs
<EM>web</EM> (<CODE>lynx</CODE> ou <CODE>w3m</CODE>), sans oublier tous les
outils d'administration.
<p>Même s'il existe des applications graphiques aux fonctionnalités
équivalentes, ce sont le plus souvent des interfaces graphiques faites
autour de ces mêmes utilitaires; en plus de cela, les utilitaires en
ligne de commande ont l'avantage de pouvoir fonctionner en mode non
interactif: vous pouvez lancer une gravure de <EM>CD</EM> et vous délogguer du
système ensuite en étant sûr que la gravure s'effectuera (voir la page
de manuel de la commande <CODE>nohup(1)</CODE>).
<hr><a href="012.html">Suivant : L'édition de texte: <STRONG>Emacs</STRONG> et <STRONG>VI</STRONG></a><br><a href="010.html">Précédent : Où obtenir de la documentation</a><br><a href="../">Retour</a><br><hr>Copyright © 2000 <a href="http://www.mandrakesoft.com/">MandrakeSoft</a></BODY></HTML>
See more files for this project here