Quelques notions et terminologies avant de définir le shell. Pour appréhender correctement le shell, on présentera succinctement le système d'exploitation
Pour interagir avec son système d'exploitation, l'utilisateur dispose en général d'une interface graphique. Ce type d'IHM1) facilite les usages pour l'homme mais est complexe pour la machine et exigeante en ressources matérielles et logicielles. Selon les systèmes, ces ressources ne sont pas toujours disponibles.
Quand on maîtrise l’interprétation des informations que l’on recherche, ou l’action que l’on souhaite déclencher, il est souvent plus efficace de se passer de cet intermédiaire complexe et d’opérer plus directement avec le système. Cet interpréteur plus direct est le shell.
Les termes: programme, application et logiciel sont des synonymes. Mais il existe cependant des petites nuances qui font qu’on est parfois amené à choisir l’un d’eux plutôt qu’un autre.
C'est une IHM en mode texte, une couche logicielle qui fournit l’interface entre l'utilisateur et le système d’exploitation. Il interprète les commandes saisies par l'utilisateur et destinées au système d’exploitation. Il se présente sous la forme d’une interface en ligne de commande accessible depuis la console ou un terminal. L’utilisateur lance des commandes sous forme d’une entrée texte traduite et exécutée ensuite par le shell.
Historiquement les premiers systèmes d'exploitation ne disposaient pas d’interface graphique. On interagissait donc avec le système essentiellement par échange de texte. L’écran servait à recevoir les informations fournies par le système sous forme de phrase, d’affichage de valeur ou de tableau textuel. Et l’opérateur utilisait le clavier pour saisir les ordres qu’il voulait soumettre au système. C’est cette interface d’échange textuel qu’on appelle le shell.
Un ordinateur est en ensemble d’éléments électroniques et mécaniques animé par un calculateur central appelé micro-processeur. Sur cet ensemble se greffent des composants plus ou moins « externes », dits périphériques, qui sont des dispositifs dédiés aux entrées et sorties de données vers et depuis le micro-processeur. Certains de ces périphériques sont en charge de l’interaction avec l’utilisateur comme par exemple le haut-parleur, le clavier ou encore l’écran. Pour chacun de ces types de périphériques, il y a de nombreux modèles avec pour chacun d’eux des spécificités techniques propres. L’utilisation de ces équipements depuis un programme informatique demanderait au concepteur de ce programme (le programmeur) d’écrire du code qui va interagir directement avec les équipements. Mais c’est là un travail complexe, car il faudrait prendre en compte toutes les diversités techniques pour un même type d’équipement. Car la portabilité d’un tel code (le fait d’assurer son bon fonctionnement pour tous les cas de figure) obligerait à prendre en compte, dans le développement, tous les périphériques qui pourraient être rencontrés. Ce serait là une tâche beaucoup trop longue et compliquée, et le résultat serait un programme dont le code serait volumineux avec le risque d’un nombre important de bugs. Aussi, la solution proposée à cette problématique est ce qu’on appelle le système d’exploitation.
Le système d’exploitation est un logiciel système qui joue un rôle d’intermédiaire entre les programmes applicatifs et les éléments matériels de l’ordinateur. C’est le premier programme exécuté au démarrage de la machine, et c’est le seul qui reste en permanence en exécution. On le nomme également noyau (kernel). Le rôle du noyau est de masquer l’hétérogénéité des composants en offrant des fonctionnalités de manipulation uniformes (abstractions ou virtualisations), quel que soit le dispositif réellement connecté à l’ordinateur. Il décharge ainsi les programmes de la gestion spécifique de chaque matériel. Le noyau gère notamment les entrées/sorties (I/O :Inputs/Outputs), que ce soit vers ou depuis les périphériques de stockage, le clavier ou encore l’écran. C’est aussi un gestionnaire de ressources qui s’occupe de distribuer la mémoire,le temps de calcul CPU, les accès aux périphériques, etc. de manière équitable et efficace entres les différents programmes qui s’exécutent en même temps. La vision simplifiée que l’on peut avoir d’un ordinateur peut se représenter par la figure 0.3.1. L’utilisateur accède à des applications qui utilisent des ressources matérielles qui sont gérées et contrôlées par le noyau. Rien ne peut se faire sans le concours du noyau. C’est la raison pour laquelle l’ordinateur se bloque lorsqu’il y a une erreur dans le noyau.
Le shell (coquille en français) est la couche logicielle pour accéder aux fonctions du noyau, aux commandes et utilitaires du système d’exploitation. La philosophie des systèmes d’exploitation de type Unix est de privilégier une diversité de petits programmes utilitaires spécialisés et optimisés (principe KISS2), plutôt que des programmes volumineux capables de « tout faire ». Mais « tout faire » est devenu possible à l’aide du shell. En effet, le shell donne à l’utilisateur les moyens de manipuler tous les programmes, et même de les assembler pour accomplir des tâches complexes. Il en résulte un procédé bien plus flexible et efficace, et c’est ce qui explique que le shell occupe encore aujourd’hui une place importante dans le paysage informatique moderne.
Le shell se présente sous la forme d’une interface en ligne de commande, accessible depuis une console, qu’on appelle aussi un terminal. L’utilisateur exécute des commandes sous la forme d’une ligne de texte dont le shell se charge d’interpréter la syntaxe. Le shell est ainsi une application qui sert d’interface entre l’utilisateur et le système d’exploitation Unix. En fait, le shell exécute les commandes que l’utilisateur saisit dans la console, c’est ce qu’on appelle le mode interactif. Mais il peut aussi traiter une liste de commandes pré-enregistrées dans un fichier; on parle alors de mode script, ou plus généralement de script shell. Un script shell peut être utilisé pour créer des applications en combinant les fonctions du noyau, les utilitaires et les applications. Et comme si cela ne suffisait pas, le shell comporte des structures de programmation qui apportent une flexibilité supplémentaires aux scripts. Il devient alors un langage de programmation assez complet. Les scripts shell sont particulièrement adaptés aux tâches administratives du système et à d’autres tâches répétitives ne nécessitant pas d’avoir recours à des développements avec des langages de programmation de haut niveau. Le shell est donc une interface par laquelle l’utilisateur interagit avec l’ordinateur. D’un point de vue fonctionnel, il joue ainsi le même rôle que l’interface graphique du système d'exploitation. Malgré le fait qu’il soit moins raffiné visuellement, sa puissance ne connaît aucune limite!
Pour terminer, notons qu’un terminal et une console peuvent être confondus fonctionnellement, ils proposent tous les deux d’effectuer une session en shell. Et, de ce point de vue, on ne peut rien faire de plus ou de moins qu’on soit dans une console ou un terminal. En pratique, la console est l’équipement physique d’un terminal sans mode graphique. C’est une sorte de Minitel (pour ceux qui ont connu). À ce titre, il n’a pas de barre de défilement sur le côté au contraire d’un terminal. Un terminal prend de nos jours la forme d’une application en mode fenêtre dans un environnement graphique pour émuler une console.
Pour le système d'exploitation, le shell est un programme utilitaire comme les autres. Par conséquent n’importe qui peut créer son propre shell du moment que celui-ci est conforme au rôle attendu d’un shell. Cela a mené à l’apparition d’une douzaine de shells concurrents dans les années 90. Les shells se différencient par leur facilité d’utilisation, leur programmabilité ainsi que par leur licence d’utilisation. Ceux qui sont conformes à la norme POSIX présentent le plus d’avantages, notamment en matière de portabilité. Car ils partagent un même ensemble de syntaxe, ce qui assure notamment que des commandes ou des scripts développés dans l’un des shells respectant cette norme pourra fonctionner à l’identique dans tous les autres shells conformes à POSIX.