# Présentation

# Présentation du shell

## Les deux états du shell

Le shell, comme le normalien, ne connaît que deux états :

- le travail ;
- l'inactivité.

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.

Quand le shell est inactif, il affiche une invite (prompt en anglais), qui ressemble à cela :

    chaland ~ $

Un curseur, parfois clignotant, indique que le shell attend que vous lui tapiez des instructions.

## Comment le shell trouve-t-il les commandes ?

### L'ordre de recherche

J'ai l'habitude de taper des commandes dans le shell, et je vois qu'il réagit. Mais comment comprend-il ce que je veux faire ?

Prenons un cas simple. Je tape la commande `bonjour` à l'invite (prompt) du shell. Il va chercher à plusieurs endroits ce que j'entends par là :

1. d'abord, il va se demander si `bonjour` 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 ;
2. ensuite, il va lire le contenu d'une variable, qui s'appelle `PATH`, et qui indique le « chemin » où trouver les commandes que l'on appelle. Par exemple, si la variable PATH contient les répertoires :
   - `/usr/bin`
   - `/bin` et
   - `/home/toto/bin`,
   alors le shell va chercher successivement les commandes :
   - `/usr/bin/bonjour`,
   - `/bin/bonjour` et
   - `/home/toto/bin/bonjour` ;
3. enfin, s'il ne trouve la commande dans aucun des répertoires référencés par le `PATH`, il va renvoyer un message d'erreur en disant que désolé, il ne voit pas ce que l'on entend par `bonjour`. Exemple :

       chaland ~ $ bonjour
       bonjour: Command not found

La variable `PATH` consiste en une liste de répertoires séparés par des « `:` ». Si vous voulez voir à quoi ressemble votre PATH, tapez :

    chaland ~ $ echo $PATH

### Les commandes internes

Certaines commandes du shell ne sont pas des programmes mais des commandes internes (builtins functions). Comme nous l'avons vu, elles sont directement reconnues et exécutées par le shell. Un exemple de commande interne est `cd` ; elle modifie le répertoire courant du shell.

Attention : si vous créez un script (c'est-à-dire un programme écrit en langage shell) qui utilise `cd`, 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.

Exemple : je crée un script `aller` qui contient les lignes suivantes :

    #! /bin/sh
    cd $*

Nous aurons alors :

    chaland ~ $ aller toto
    chaland ~ $ cd toto
    chaland ~/toto $

## Quels programmes utilisent le langage du shell ?

### Les scripts shell

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.

### Le script `.profile`

Il existe un script spécial, qui est exécuté au moment où on se connecte. Ce script est contenu dans le fichier `$HOME/.profile`. C'est ce fichier qui vous dit s'il y a de nouveaux messages dans forum, si vous avez du courrier, etc.

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.

### Le script `.xinitrc`

Il existe encore le script `.xinitrc`, qui lance X ; X est le gestionnaire de fenêtres classique sous Unix.

### Créer ses propres scripts

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 programmation de scripts en shell. Ou bien vous pouvez revenir à la page centrale sur le shell, d'où vous pourrez vous orienter vers d'autres parties du cours.

Basé sur un polycopié de Roberto Di Cosmo, Xavier Leroy et Damien Doligez. Modifications : Nicolas George, Baptiste Mélès. Dernière modification le .