<?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>