tuteurs.ens.fr/unix/shell/presentation.tml
2009-09-27 15:43:57 +02:00

197 lines
5.4 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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
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.
Dernière modification le <date value="$Date: 2007-07-17 10:03:44 $"
/>.
</div>
</body>
</html>