tuteurs.ens.fr/unix/shell/presentation.tml

197 lines
5.4 KiB
Text
Raw Normal View History

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Présentation</title>
</head>
<body>
<h1>Présentation du shell</h1>
<h2><a name="etats">Les deux états du shell</a>
</h2>
<p>
Le shell, comme le normalien, ne connaît que deux états :
</p>
<ul>
<li> le travail ;</li>
<li> l'inactivité.</li>
</ul>
<p>
Le shell, une fois lancé, est inactif : il attend qu'on lui donne
des ordres. Quand on lui en donne un, il l'exécute ; et quand il a
terminé, il retourne à son état d'inactivité, en attente d'un nouveau
commandement.
</p>
<p>
Quand le shell est inactif, il affiche une <em>invite</em>
(<em>prompt</em> en anglais), qui ressemble à cela :
</p>
<pre><span class="prompt">chaland ~ $</span></pre>
<p>
Un curseur, parfois clignotant, indique que le shell attend que vous lui
tapiez des instructions.
</p>
<h2><a name="path">Comment le shell trouve-t-il les commandes ?</a>
</h2>
<h3>L'ordre de recherche</h3>
<p>
J'ai l'habitude de taper des <a href="commande.html">commandes</a> dans
le shell, et je vois qu'il réagit. Mais comment comprend-il ce que je
veux faire ?
</p>
<p>
Prenons un cas simple. Je tape la commande <code>bonjour</code> à
l'invite (<em>prompt</em>) du shell. Il va chercher à plusieurs endroits
ce que j'entends par là :
</p>
<ol>
<li> d'abord, il va se demander si <code>bonjour</code> n'est pas une de
ses commandes intégrées ; si c'est le cas, il l'exécute
directement, sinon il passe à l'étape suivante ;</li>
<li> ensuite, il va lire le contenu d'une <a
href="variable.html">variable</a>, qui s'appelle <code>PATH</code>, et
qui indique le « chemin » où trouver les commandes que l'on
appelle. Par exemple, si la variable PATH contient les
répertoires :
<ul>
<li> <code>/usr/bin</code> </li>
<li> <code>/bin</code> et </li>
<li> <code>/home/toto/bin</code>,</li>
</ul>
alors le shell va chercher successivement les commandes :
<ul>
<li> <code>/usr/bin/bonjour</code>,</li>
<li> <code>/bin/bonjour</code> et </li>
<li> <code>/home/toto/bin/bonjour</code> ;</li>
</ul></li>
<li> enfin, s'il ne trouve la commande dans aucun des répertoires
référencés par le <code>PATH</code>, il va renvoyer un message d'erreur
en disant que désolé, il ne voit pas ce que l'on entend par
<code>bonjour</code>. Exemple :
<pre>
<span class="prompt">chaland ~ $</span> bonjour
bonjour: Command not found</pre> </li>
</ol>
<p> La variable <code>PATH</code> consiste en une liste de répertoires
séparés par des « <code>:</code> ». Si vous voulez voir à quoi
ressemble votre PATH, tapez :
</p>
<pre>
<span class="prompt">chaland ~ $</span> echo $PATH</pre>
<h3><a name="builtins">Les commandes internes</a></h3>
<p>
Certaines commandes du shell ne sont pas des programmes mais des
commandes <em>internes</em> (<em>builtins functions</em>). Comme nous
l'avons vu, elles sont directement reconnues et exécutées par le shell.
Un exemple de commande interne est <code>cd</code> ; elle modifie
le répertoire courant du shell.
</p>
<div class="attention">
<p>
Attention : si vous créez un script (c'est-à-dire un programme
écrit en langage shell) qui utilise <code>cd</code>, il ne modifie pas
le répertoire courant du shell qui lance ce script, mais celui d'un
shell qui est créé à l'occasion de l'exécution de ce script, et qui
meurt à la fin de cette exécution.</p>
<p> Exemple : je crée un script <code>aller</code> qui contient les
lignes suivantes : </p>
<pre>
#! /bin/sh
cd $*</pre>
<p>
Nous aurons alors :
</p>
<pre>
<span class="prompt">chaland ~ $</span> aller toto
<span class="prompt">chaland ~ $</span> cd toto
<span class="prompt">chaland ~/toto $</span></pre>
</div>
<h2><a name="prog">Quels programmes utilisent le langage du shell ?</a></h2>
<h3>Les scripts shell</h3>
<p>
La répétition de commandes complexes en ligne de commande du shell est
rapidement fastidieuse ; aussi est-il très pratique de connaître
les bases de la programmation de scripts shell. Les scripts servent à
automatiser ou systématiser des tâches.
</p>
<h3>Le script <code>.profile</code></h3>
<p>
Il existe un script spécial, qui est exécuté au moment où on se connecte. Ce
script est contenu dans le fichier <code>$HOME/.profile</code>. C'est ce
fichier qui vous dit s'il y a de nouveaux messages dans forum, si vous avez
du courrier, etc.
</p>
<p>
Ce fichier est normalement mis à jour automatiquement par les scripts de la
config conscrits. Il est néanmoins possible de le modifier pour changer des
options.
</p>
<h3>Le script <code>.xinitrc</code></h3>
<p> Il existe encore le script <code>.xinitrc</code>, qui lance X ;
X est le gestionnaire de fenêtres classique sous Unix.
</p>
<h3>Créer ses propres scripts</h3>
<p>
Le nombre de scripts possibles est illimité ; vous pouvez en créer
autant que vous voulez, selon vos besoins : c'est ainsi que l'on
personnalise son système et qu'on l'adapte à ses exigences, plutôt que
l'inverse. Pour en savoir plus sur la programmation en shell, consultez
les pages consacrées à la <a href="script.html">programmation de scripts
en shell</a>. Ou bien vous pouvez revenir à la <a href="index.html">page
centrale sur le shell</a>, d'où vous pourrez vous orienter vers d'autres
2005-09-08 01:00:03 +02:00
parties du cours.
</p>
<div class="metainformation">
Basé sur un polycopié de Roberto Di Cosmo, Xavier Leroy et Damien
Doligez.
Modifications : Nicolas George, Baptiste Mélès.
<date value="from git" />
</div>
</body>
</html>