[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

debian-guide_fr-1.0_chap8.sgml



<chapt> Utiliser le shell

<p>
En lisant les chapitres précédents, vous avez déjà interagit avec le
shell. Le shell est le programme qui reçoit vos commandes et qui les
exécute. Dans ce chapitre, nous allons explorer le shell plus en
avant, avec une mention spéciale pour le personnaliser afin de lui
faire faire le travail que vous voulez qu'il fasse.

<sect> Les variables d'environnement

<p>
Chaque processus a un <em>environnement</em> associé. Un environnement
est ensembles de <em>variables d'environnement</em>. Une variable est
une valeur modifiable avec un nom déterminé. Par exemple, le nom
<em>EMAIL</em> peut se référer à la valeur
<prgn>joe@nowwhere.com</prgn>. Sa valeur peut changer ; <em>EMAIL</em>
peut aussi se référer à <prgn>jane@somewhere.com</prgn>.

<p>
Puisque le shell n'est qu'un processus parmi d'autres, il possède
aussi son environnement. Vous pouvez visualiser votre environnement en
entrant la commande <prgn>pintenv</prgn>. La figure suivante donne un
exemple de résultat de sortie de cette commande. Sur votre système, la
sortie sera différente bien que similaire.

<p>
<example>
PAGER=less
HOSTNAME=icon
MAILCHECK=60
PS1=$
USER=username
MACHTYPE=i486-pc-linux-gnu
EDITOR=emacs
DISPLAY=:0.0
LOGNAME=username
SHELL=/bin/bash
OSTYPE=linux-gnu
HISTSIZE=150
TERM=xterm-debian
TEXEDIT=jed
PATH=/usr/sbin:/usr/sbin/:/usr/local/bin/:
/usr/bin/:/bin/:/usr/bin/X11/:/usr/games
_=/usr/bin/printenv
</example>

<p>
Les variables d'environnement sont une façon de configurer le
système. Par exemple, la variable <em>EDITOR</em> vous permet de
sélectionner votre éditeur préféré pour poster des <em>news</em>,
écrire du courrier électronique et ainsi de suite.

<p>
Régler ses variables d'environnement est quelque chose de triviale. En
pratique, commençons par personnaliser votre prompteur de shell ainsi
que votre visualiseur de texte avec les variables
d'environnement. Tout d'abord, commençons par un peu
d'informations basiques.

<p>
<example>
man less
</example>

<p>
Cette commande vous permet d'accéder au manuel en ligne de la commande
<prgn>less</prgn>. Pour éviter de dérouler tout le texte d'un seul
coup à l'écran, <prgn>man</prgn> invoque un <em>pageur</em> qui vous
déroule le texte page par page, à chaque fois que vous appuyez sur la
touche <em>espace</em>. Par défaut, le pageur utilisé est
<prgn>more</prgn>.

<p>
Continuons et regardons un peu la page de manuel de <prgn>less</prgn>,
qui est un pageur très puissant. Affichez la page suivante en appuyant
sur espace et q pour quitter. <prgn>more</prgn> quitte aussi
automatiquement la page en arrivant à la fin.

<p>
<example>
export PAGER=less
</example>

<p>
Après avoir lu les avantages de <prgn>less</prgn>, il se peut que vous
vouliez l'utiliser pour lire les pages de manuel. Pour ce faire, vous
devez positionner la variable d'environnement <em>PAGER</em>.

<p>
La commande pour ajuster une variable d'environnement dans
<prgn>bash</prgn> a toujours le format suivant:

<p>
<example>
export NOM=valeur
</example>

<p>
<prgn>export</prgn> signifie déplacer la variable du shell dans votre
environnement. Cela veut dire que les programmes autres que le shell
(par exemple, un visualiseur de textes) seront capables d'y accéder.

<p>
<example>
echo $PAGER
</example>

<p>
C'est la façon la plus aisée d'accéder au contenu de la
variable. <em>$PAGER</em> demande en fait au shell d'insérer la valeur
de <em>PAGER</em> <em>avant</em> d'invoquer la
commande. <prgn>echo</prgn> renvoie simplement l'argument: dans ce
cas, cela renvoie simplement la valeur du contenu de <em>PAGER</em>,
c'est-à-dire <prgn>less</prgn>.

<p>
<example>
man more
</example>

<p>
renvoie maintenant la page de manuel de <prgn>more</prgn>. Mais
maintenant, <prgn>man</prgn> utilise <prgn>less</prgn> comme pageur.

<p>
<prgn>less</prgn> a beaucoup plus de fonctionnalités que
<prgn>more</prgn>. Par exemple, vous pouvez paginer en arrière à
l'aide de la touche <prgn>b</prgn>. Vous pouvez aussi vous déplacer en
avant et en arrière à l'aide des flèches de
direction. <prgn>less</prgn> ne sort pas lorsque vous avez atteint le
bas du fichier de la page de manuel: il attend que vous appuyez sur la
touche <prgn>q</prgn>.

<p>
Vous pouvez essayer quelques spécificités de la commande
<prgn>less</prgn>, comme <prgn>b</prgn>, pour vérifier qu'elles ne
fonctionnent pas avec <prgn>more</prgn>.

<p>
<example>
unset PAGER
</example>

<p>
Si vous ne désirez pas spécifier un pageur, vous pouvez appliquer la
commande <prgn>unset</prgn> à la variable. <prgn>man</prgn> utilisera
alors <prgn>more</prgn> par défaut, comme il le faisait avant que vous
ne changiez la variable.

<p>
<example>
echo $PAGER
</example>

<p>
Comme la variable <em>PAGER</em> a été détruite, <prgn>echo</prgn> ne
renverra rien.

<p>
<example>
PS1=bonjour:
</example>

<p>
Pour s'amuser, tentons de modifier le prompteur. $ devrait maintenant
être modifié. Voici les étapes en détails:

<p>
<example>
$ echo $PS1
$
$PS1=bonjour:
bonjour:echo Mon prompteur est $PS1
Mon prompteur est bonjour: 
bonjour:
</example>

<p>
<prgn>export</prgn> n'est pas nécessaire car vous ne modifier que le
comportement de votre propre shell. Il n'y a pas de raison d'exporter
dans l'environnement de tous les programmes pour faire le
test. Techniquement parlant, <em>PS1</em> est plutôt une <em>variable
de shell</em> qu'une variable d'environnement.

<p>
Si vous le voulez, vous pouvez exporter la variable de shell, la
transformant ainsi en variable d'environnement. Si vous agissez de la
sorte, les programmes lancés à partir du shell pourront la voir.
</sect>

<sect> Où les commandes résident: la variable <em>PATH</em>

<p>
Lorsque vous tapez une commande dans votre shell, ce dernier doit
trouver le programme correspondant sur votre disque avant de
l'exécuter. Si le shell devait examiner l'ensemble du disque dur, cela
serait extrêmement lent. À la place, il se contente d'aller chercher
dans un ensemble de répertoires contenu dans la variable
d'environnement <em>PATH</em>. Cette liste de répertoires est le
<em>chemin d'accès</em> du shell. Lorsque vous entrez une commande, le
shell va chercher dans chacun des répertoires de ce chemin pour
trouver la commande que vous lui avez demandé de lancer.

<p>
Il se peut que vous ayez à changer la variable <em>PATH</em> si vous
installez vous-même des programmes à des endroits non
conventionnels. La valeur du <em>PATH</em> est une liste de
répertoires séparés par des « : ».

<p>
<example>
/usr/local/bin:/usr/bin/:/bin:/usr/bin/X11:/usr/games
</example>

<p>
Cette valeur est définie dans le fichier <prgn>/etc/profile</prgn> et
applicable à tous les utilisateurs. Il est très facile de modifier
cette valeur, comme d'ailleurs l'ensemble des variables
d'environnement. Si vous tapez la commande <prgn>ls</prgn>, le shell
va d'abord la chercher dans <prgn>/usr/local/bin</prgn>;
<prgn>ls</prgn> ne s'y trouve pas donc il va continuer et la chercher
dans <prgn>/usr/bin/</prgn> ; comme cela échoue encore, il vérifie
<prgn>/bin</prgn>. Il la trouve enfin et stoppe sa recherche pour
exécuter le programme <prgn>/bin/ls</prgn>. Si la commande
<prgn>/usr/bin/X11/ls</prgn> existe (ce n'est pas le cas mais c'est pour
l'exemple), elle serait tout simplement ignorée.

<p>
Vous pouvez voir quel <prgn>ls</prgn> le shell va utiliser grâce à la
commande <prgn>type</prgn>. <prgn>type ls</prgn> va vous renvoyer
<prgn>/bin/ls</prgn>. Essayez-le vous-même.

<p>
<example>
$ type type
type is a shell builtin<footnote>type est une fonction interne du shell</footnote>
</example>

<p>
<prgn>type</prgn> n'est pas vraiment un programme: c'est une
fonctionnalité du shell mais vous pouvez l'utiliser comme un programme
extérieur.

<p>
Il y a de nombreuses commandes de la même sorte. Tapez <prgn>man
builtins</prgn> pour visualiser la page les décrivant. De façon
générale, il n'est pas nécessaire de savoir si une commande est une
fonctionnalité interne ou bien un programme extérieur. Mais il faut
garder à l'esprit qu'une fonctionnalité interne ne sera pas visible
via un <prgn>ps</prgn> ou un <prgn>top</prgn> car il ne s'agit pas
d'un processus séparé: c'est une partie intégrante du shell.
</sect>

<sect> Fichiers de configuration

<p>
De nombreuses applications sous Linux vous permettent de modifier leur
comportement à certains moment en transformant les fichiers contenant
leurs informations de configuration. Ces fichiers de configuration
peuvent contenir des informations de lancement, des réglages de
configuration ou bien des ajustements pour la sortie. En général, un
nom de fichier de configuration est basé sur le nom de l'application
qu'il est sencé modifier. Cette convention de nom permet de déterminer
rapidement à quelle application appartient quel fichier de
configuration pour les réglages.

<sect1> Configuration système contre configuration personnelle

<p>
Il est important de se rappeler qu'il y a deux façons différentes de
configurer sur un système Debian. La <em>configuration système</em>
affecte tous les utilisateurs. Ces configurations se trouve dans le
répertoire <prgn>/etc</prgn> et donc il est généralement nécessaire
d'être root pour modifier ces fichiers. Vous pouvez avoir besoin de
configurer la façon dont se connecte le système à Internet par
exemple, ou bien configurer les butineurs HTML pour leur faire
afficher la page de la société en se lançant. Si vous désirez
effectuer le changement pour tous les utilisateurs à la fois, vous
devez faire les transformations dans <prgn>/etc</prgn>. Des fichiers
de configuration simples de <prgn>/etc</prgn> sont
<prgn>/etc/X11/XF86Config, /etc/lynx.cfg</prgn> et
<prgn>/etc/ppp/options</prgn>. En fait, presque tous les fichiers de
<prgn>/etc</prgn> sont des fichiers de configuration.

<p>
La <em>configuration personnelle</em> n'affecte qu'un simple
utilisateur. Les fichiers cachés sont utilisés à cette fin. Par
exemple, le fichier <prgn>~/.newrc</prgn> contient une liste
d'articles sur USENET (groupes de discussions) que vous avez lus et à
quels groupes vous avez souscrit. Cela permet à des lecteurs de news
comme <prgn>trn</prgn> ou <prgn>GNUS</prgn> de n'afficher que les
articles non lus dans les groupes qui vous intéressent. Cette
information est bien-sûr propre à chaque utilisateur du système et
ainsi chacun possède son propre <prgn>.newrc</prgn> dans son
répertoire de travail personnel.
</sect1>
</sect>

<sect> Aliases

<p>
Si vous utilisez la même commande de nombreuses fois, il se peut que
vous vous fatiguiez à la taper. <prgn>bash</prgn> vous permet d'écrire
un raccourci - on dit <em>alias</em> - de votre commande.

<p>
Admettons que vous désiriez toujours utiliser les options
<prgn>--almost-all</prgn> et <prgn>--color=auto</prgn> de
<prgn>ls</prgn>. Faîtes un alias:

<p>
<example>
alias myls='ls --almost-all --color=auto'
</example>

<p>
Maintenant, il vous suffit de taper <prgn>myls</prgn> à la place de la
commande complète. Pour voir ce qu'est réellement <prgn>myls</prgn>,
il suffit de taper <prgn>type myls</prgn>. Pour voir la liste complète
des <em>aliases</em> que vous avez défini, taper simplement
<prgn>alias</prgn> tout seul comme commande.
</sect>

<sect> Contrôler les entrées et les sorties

<p>
Au fur et à mesure de vos expériences avec Linux, vous allez
comprendre combien manipuler les entrées et sorties des applications
est un concept très puissant. Cette partie décrit quelques points de
ce que peut vous apportez la redirection des entrées-sorties.

<sect1> <prgn>stdin</prgn>, <prgn>stdout</prgn>, tubes et redirection

<p>
Chaque processus a au moins trois connexions avec le monde
extérieur. L'<em>entrée standard</em> est une des sources des données
du processus. La <em>sortie standard</em> est un des endroits où le
processus envoie ses données et l'<em>erreur standard</em> est
l'endroit où le processus envoie ses messages d'erreurs (on les
abrège généralement par <prgn>stdin</prgn>, <prgn>stdout</prgn> et
<prgn>stderr</prgn>).

<p>
Les mots « source » et « endroit » sont intentionnellement vagues. Ces
lieux d'entrées-sorties standards peuvent changer avec les
utilisateurs. Cela peut être l'écran, le clavier, un fichier et même
une connexion réseau. Vous pouvez spécifier les endroits à utiliser.

<p>
Lorsque vous lancez un programme à partir du shell, l'entrée standard
est généralement le clavier et la sortie standard, ainsi que les
erreurs, s'affichent sur votre écran. Vous pouvez bien-sûr demander à
votre shell de modifier ce comportement.

<p>
Par exemple, la commande <prgn>echo</prgn> envoie son entrée standard
sur sa sortie standard, normallement à l'écran. Mais vous pouvez
décider de l'envoyer plutôt dans un fichier à l'aide de
<em>l'opérateur de redirection de sortie</em>, &gt . Par exemple, pour
écrire le mot « Bonjour » dans le fichier <prgn>monfichier</prgn>,
utilisez la commande suivante:

<p>
<example>
echo Bonjour &gt monfichier
</example>

<p>
Utilisez ensuite <prgn>cat</prgn> ou bien votre pageur
(<prgn>more</prgn> ou <prgn>less</prgn>) pour visualiser le contenu du
fichier <prgn>monfichier</prgn>.

<p>
<example>
$ echo Bonjour &gt monfichier
$ cat monfichier
Bonjour
$
</example>


<p>
Vous pouvez changer l'entrée standard d'une commande avec
<em>l'opérateur de redirection d'entrée</em>, &lt . Par exemple,
<prgn>cat &lt monfichier</prgn>. En pratique, ce n'est pas
commode. Pour simplifier, <prgn>cat</prgn> accepte un fichier pour
argument. Ainsi, vous pouvez vous contenter de taper <prgn>cat
monfichier</prgn> et l'effet sera identique.

<p>
Si l'on appronfondit un peu, la commande <prgn>cat &lt
monfichier</prgn> signifie que le shell ouvre le fichier
<prgn>monfichier</prgn> et envoie son contenu dans l'entrée standard
de <prgn>cat</prgn>. <prgn>cat monfichier</prgn>, sans l'opérateur de
redirection, signifie que la commande <prgn>cat</prgn> reçoit un
argument unique (<prgn>monfichier</prgn>), l'ouvre d'elle-même et
ensuite l'affiche à l'écran.

<p>
Il y a bien-sûr une raison pour cette double fonctionnalité. Par
exemple, il est possible de connecter la sortie standard d'une
commande sur l'entrée standard d'une autre commande. Cela s'appelle un
<em>tube</em> (<em>pipeline</em> en anglais). Cela utilise
l'<em>opérateur tube</em><footnote>Cela dépend de votre clavier: cela
peut apparaître comme une barre verticale ou une barre verticale en
deux parties mais cela doit toujours se trouver au-dessus du contre
<em>slash</em> (NDT: pour les claviers <em>qwerty</em>
uniquement... tapez <prgn>Alt Gr 6</prgn> pour les
<em>azerty)</em></footnote>, | .

<p>
Peut-être désirez-vous voir la <em>GNU General Public License</em> à
l'envers ? Pour le faire, utilisez la commande <prgn>tac</prgn> (c'est
un <prgn>cat</prgn> mais inversé). Essayez:

<p>
<example>
tac /usr/doc/copyright/GPL
</example>

<p>
Malheureusement, cela défile beaucoup trop rapidement pour être
lisible. Donc vous ne voulez avoir que quelques paragraphes: la
solution est un tube:

<p>
<example>
tac /usr/doc/copyright/GPL | less
</example>

<p>
Cela prend donc la sortie standard de <prgn>tac</prgn>, qui est la GPL
lue à l'envers, et l'envoie dans l'entrée standard de
<prgn>less</prgn>.

<p>
Vous pouvez enchaîner ainsi autant de commandes que vous le
désirez. S'il vous prend une envie inexpliquable de transformer tous
les G en Q, il vous suffit d'utiliser la commande <prgn>tr G Q</prgn>
comme ceci:

<p>
<example>
tac /usr/doc/copyright/GPL | tr G Q | less
</example>

<p>
Vous pouvez obtenir le même résultat en utilisant des fichiers
temporaires et des redirections, par exemple:

<p>
<example>
tac /usr/doc/copyright/GPL > tmpfile
tr G Q < tmpfile > tmpfile2
less < tmpfile2
rm tmpfile tmpfile2
</example>

<p>
Il est clair qu'un tube est bien plus pratique.
</sect1>
</sect>

<sect> Expansion de nom de fichier

<p>
Vous désirez souvent utiliser une commande sur tout un groupe de
fichiers. Des caractères spéciaux (<em>wildcards</em>) sont utilisés
pour créer des <em>termes génériques d'expansion de nom de
fichiers</em>. Une série de lettres et des caractères spéciaux
permettent ainsi de lister des fichiers. Par exemple, le motif
<prgn>/etc/*</prgn> remplace la liste de tous<footnote>Actuellement,
les fichiers commençant par un point ne sont pas inclus dans
l'expansion de *</footnote> les fichiers de <prgn>/etc</prgn>.

<p>
* est un motif qui remplace n'importe quelle série de caractères et
 ainsi l'expression <prgn>/etc/*</prgn> fournira la liste de tous les
 fichiers commençant par <prgn>/etc/</prgn>.

<p>
Cette liste de fichiers est très utile comme un jeu d'arguments pour une
commande. Par exemple, le répertoire <prgn>/etc</prgn> contient une
série de sous-répertoires appelés <prgn>rc0.d, rc1.d</prgn>,
etc... Normalement, pour visualiser le contenu de ces répertoires,
vous devriez taper les commandes suivantes:

<p>
<example>
ls /etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d
ls /etc/rc4.d /etc/rc5.d /etc/rc6.d /ect/rcS.d
</example>

<p>
C'est particulièrement lourd et pénible. À la place, il suffit
d'utiliser le caractère spécial « ? » comme suit:

<p>
<example>
ls /etc/rc?.d
</example>

<p>
<prgn>/etc/rc?.d</prgn> renvoie alors une liste de nom de fichiers,
commençant par <prgn>rc</prgn>, suivant d'un caractère et se terminant
pas <prgn>.d</prgn>.

<p>Les caractères spéciaux disponibles sont les suivants:

<p>
<list>
<item> *
<p>
  Correspond à n'importe quel groupe de 0 ou plus de caractères.
<item> ?
<p>
  Correspond à un caractère quelconque mais unique.
<item> <prgn>[...]</prgn>
<p>
  Si vous entourez des caractères de crochets, le résultat est une
  correspondance avec ces caractères. Par exemple, <prgn>[abc]</prgn>
  correspond soit à un <prgn>a</prgn>, soit à un <prgn>b</prgn> ou
  soit à un <prgn>c</prgn>. Si vous ajouter un ^ après le premier
  crochet, on retourne le sens. Ainsi, <prgn>[^abc]</prgn> correspond
  à tous les caractères qui ne sont pas un <prgn>a</prgn>, un
  <prgn>b</prgn> ou un <prgn>c</prgn>. Vous pouvez aussi inclure un
  intervalle comme <prgn>[a-j]</prgn> qui correspond à tout entre
  <prgn>a</prgn> et <prgn>j</prgn>. La correspondance est sensible à
  la casse des caractères donc si vous voulez inclure toutes les
  lettres, vous devz utilisez <prgn>[a-zA-Z]</prgn>.
</list>

<p>
Les motifs d'expansion sont très simples, à partir du moment où vous
les voyez dans des exemples concrets:

<p>
<list>
<item> <prgn>*.txt</prgn>
<p>
  Cela vous fournit la liste de tous les fichiers finissant pas
  <prgn>.txt</prgn> puisque * correspond à tout.
<item> <prgn>*.[hc]</prgn>
<p>
  Cela vous fournit une liste de fichier se terminant soit par
  <prgn>.h</prgn> soit par <prgn>.c</prgn>.
<item> <prgn>a??</prgn>
<p>
  Cela vous fournit la liste de tous les fichiers de trois lettres
  commençant par un <prgn>a</prgn>.
<item><prgn>[^a]??</prgn>
<p>
  Cela vous fournit la liste de tous les fichiers de trois lettres ne
  commençant pas par la lettre <prgn>a</prgn>.
<item> <prgn>a*</prgn>
<p>
  Cela vous fournit l'ensemble des fichiers commençant par
  <prgn>a</prgn> sans tenir compte de leur nombre de lettres.
</list>

</sect>

</chapt>

-- 
      |\      _,,,---,,_       Patrice KARATCHENTZEFF  
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:pkarat@club-internet.fr 
     |,4-  ) )-,_. ,\ (  `'-'         p.karatchentzeff@free.fr
    '---''(_/--'  `-'\_)





Reply to: