Le shell est un programme permettant les échanges entre le système Linux et l'utilisateur : c'est un interpréteur de commandes.
Son utilisation s'étend à la programmation, grâce à la gestion des variables, des boucles et des flux Entrée / Sortie.
Il existe plusieurs Shell disponibles sur les systèmes Linux.
Le Shell considéré comme étant le plus ancien est le Bourne Shell (sh), du nom de son créateur Steve Bourne.
Bill Joy créa quant à lui le C-Shell (csh), incompatible avec le Bourne Shell mais permettant le rappel de commande, le contrôle des tâches et l'utilisation des alias de commande.
Plus tard, David Korn repris le Bourne Shell en y incluant les fonctionnalités du C-Shell.
Ce nouvel interpréteur prendra lui aussi le nom de son créateur en s'appelant Korn Shell (ksh). Il s'agit du Shell le plus utilisé des systèmes Unix commerciaux.
Le projet GNU développera aussi son alternative aux Shell existant avec le Bourne Again Shell (bash), conforme comme le ksh à la norme POSIX en y ajoutant quelques extensions. C'est l'interpréteur de commande fournit en standard sur les distributions Linux.
Le Korn Shell et le bash ont une compatibilité descendante avec le Bourne Shell, l'écriture d'un script en Bourne Shell assure la meilleur portabilité possible.
Il comporte cependant quelques lacunes et certaines fonctionnalités font défaut, c'est pourquoi il est possible de lui préférer le Korn Shell ou le Bash.
Il existe de catégories de variables :
En Bourne Shell les variables sont uniquement de type caractère. Une variable ne peut pas commencer par un chiffre.
Les autres Shell acceptent d'autres types de variables :
Affectiation :
Syntaxe :
nom_variable="valeur_variable"
Un nom de variable commence par un caractère alphanumérique ou un underscore.
Les caractères suivants sont alphanumériques : [a-zA-Z0-9_]
Attention à ne jamais mettre d'espace avant et après le signe égale
=. Il faut protéger les espace dans le contenu des variables. Une variable non déclarée est considérée comme vide de valeur.
Exportation de variables :
Il y a deux possibilités d'exportation.
Soit faire l'exportation à la définition de la variable, soit l'exporter après l'affectation de sa valeur.
Syntaxe :
export nom_variable
export nom_variable="valeur_variable"
Pour utiliser une variable il suffit de mettre le symbole $ devant le nom de la variable.
Le dollar étant un caractère de substitution, lors de l'exécution de la commande le Shell remplacera le nom de la variable par son contenu.

Le meilleur moyen et le plus propre pour détruire une variable est d'utiliser unset
Syntaxe :
unset nom_variable
| Options | Descriptions |
|---|---|
set |
Permet de visualiser toutes les variables (utilisateur ET environnement) |
env |
Permet de visualiser les variables d'environnement |
echo $nom_variable |
Permet d'afficher la valeur d'une variable |
il est possible de rendre des variables en lecture seule pour les protéger d'éventuelles modifications.
Syntaxe :
readonly nom_variable="valeur_variable"
typeset -r nom_variable="valeur_variable"
il existe de nombreuses variables d'environnement.
Voici quelques exemples importants :
| Variables | Descriptions |
|---|---|
LOGNAME |
Nom de l'utilisateur de connexion |
MAIL |
Chemin d'accès au fichier boite aux lettres |
PATH |
Chemin de recherche des exécutables (séparés par des ":") |
PS1 |
Prompt du Shell |
PS2 |
Prompt de continuation |
SHELL |
Shell de connexion |
TERM |
Type de terminal utilisé |
HOME |
Répertoire de connexion |
~ |
Répertoire de connexion |
Ces variables peuvent être utilisées par la commande env ou la commande set.
Par convention, le nom des variables d'environnement est en majuscule.
Analyse d'une commande pour comprendre l'exécution dans le Shell.
Contexte :
Le répertoire d'accueil de Antoine contient 6 fichiers scripts en .sh et plusieurs centaines d'autres fichiers.
Afin de lister les popriétés des fichiers scripts, Antoine exécute la commande suivante :
ls -l $HOME/*.sh
Analyse :
Le Shell actuel d'Antoine a comme PID 666
Le Shell d'Antoine analyse la ligne de commande et tente de déterminer si la commande passée dans le prompt est une commande interne ou externe au Shell.
Si c'est une commande interne il l'exécute sinon il tente de trouver le chemin d'accès de la commande ls.
ls n'est pas une commande interne.
Le Shell analyse donc la variable PATH afin de déterminer si ls est dans un de ses chemins.
Oui : ls est dans /bin/
Donc le Shell va en fait exécuter /bin/ls- l $HOME/*.sh
Le Shell d'Antoine (PID 666) génère un sous-shell afin d'exécuter la commande.
Ce nouveau Shell (PID 999 PID 666) hérite des variables d'environnement de son père.
Le Shell d'exécution analyse la ligne et remplace tous les caractères de substitution de la ligne de commande
/bin/ls- l $HOME/*.sh
$HOME : variable d'environnement (dont le sous-shell PID 999 a hérité de sa valeur par son shell père PID 666) ayant comme valeur le chemin d'accès du répertoire d'accueil d'Antoine /home/Antoine
*.sh : Ici le métacaractère est analysé : * correspond à n'importe quel caractère de 0 à n fois.
Le Shell d'exécution va donc remplacer $HOME/*.sh par tout ce qui correspond :
/home/Antoine/backup.sh/home/Antoine/restore.sh/home/Antoine/test.sh/home/Antoine/createuser.sh/home/Antoine/deleteuser.sh/home/Antoine/install.shLe Shell d'exécution trouve donc les 6 fichiers *.sh du répertoire d'Antoine et les donnes en argument de la commande ls.
Le Shelld'exécution exécute donc la commande
ls -l /home/Antoine/backup.sh /home/Antoine/restore.sh /home/Antoine/test.sh /home/Antoine/createuser.sh /home/Antoine/deleteuser.sh /home/Antoine/install.sh
On notera ici l'intérêt flagrant de l'utilisation de caractères de substitution et de des variables.
Le fait de faire ls -l $HOME/*.sh revient donc à faire ls -l /home/Antoine/backup.sh /home/Antoine/restore.sh /home/Antoine/test.sh /home/Antoine/createuser.sh /home/Antoine/deleteuser.sh /home/Antoine/install.sh
La commande s'exécute donc par le CPU afin de collecter toutes les informations et les erreurs.
Quand la commande finit son exécution, le Shell d'exécution (PID 999) envoie à son père (PID 666) les différents flux de sortie et le Shell père les traite.
Un Alias est un synonyme, une abréviation, auquel on peu associer une commande avec ou sans arguments. Il peut être défini en ligne de commande, dans ce cas sa durée de vie est équivalante à la durée de la session.
Il peut être également défini dans un fichier d'initialisation d'environnement (.profile ou .bashrc), ce qui en garantit l'existence et la possibilité d'utilisation d'une session à une autre.
Syntaxe :
alias nom='texte'
Le nom de l'Alias ne peut comporter que des lettres et des chiffres, aucun caractère spécial.
La substitution de l'Alias par sa définition est effectuée avant toute autre substitution sur la ligne de commande et ce, uniquement si le nom de l'Alias correspond au premier mot de la ligne de commande.
# alias ll='ls -l'
# ll
total 20
drwxr-xr-x 15 antoine antoine 4096 25 mai 21:49 antoine
drwx------ 2 root root 16384 20 mai 13:58 lost+found
D'autres substitutions peuvent être effectuées si la définition du premier alias se termine par un espace.
Pour obtenir la liste des Alias, il suffit d'exécuter la commande alias sans aucun argument

Syntaxe :
unalias nom [nom ...]
Les facilités offertes par le rappel de commande et l'auto-complétion dans un Shell tel que Bash lui procure un rendement très intéressant à tel point qu'il est bien souvent plus efficace de se déplacer et d'exécuter des commandes dans un terminal plutôt que par le biais d'une interface graphique.
| Commandes | Descriptions |
|---|---|
Flèche montante |
Rappeler les commandes précédentes, en remontant dans l'historique. On peut remonter dans tout l'historique des commandes. |
Flèche descendante |
Rappeler les commandes précédentes, en descendant dans l'historique |
!! |
Rappeler la dernière commande exécutée. |
!com |
Rappeler la dernière commande exécutée commençant par la chaîne com |
!?fich |
Rappeler la dernière commande exécutée contenant la chaîne fich |
History |
Affiche l'historique des commandes mémorisées |
!num |
Rappeler la commande numérotée num |
Après avoir fermé sa session voir même redémarré l'ordinateur, le rappel de commande reste disponible pour tous les utilisateurs. Les commandes déjà saisies sont donc stockées dans un fichier.
| Variables | Descriptions |
|---|---|
HISTCMD |
Contient le dernier numéro de commande utilisé. |
HISTFILE |
Chemin et nom du fichier de rappel. |
HISTFILESIZE |
Taille du nombre de rappels possible. |
HISTSIZE |
Taille du nombre de commandes en mémoire. |
HISTCONTROL |
Liste des options au rappel de commande. l'argument -ignoreboth permet d'ignorer les doublons de commandes. |
HISTTIMEFORMAT |
N'est généralement pas présente par défaut, permet d'horodater les commandes saisies. |
Le Bash permet la complétion automatique.
Il s'agit du fait d'incrémenter automatiquement les noms lors de la frappe au clavier.
L'auto-completion est activée en pressant une ou deux fois la touche Tabulation.
L'auto-completion est très utilisée pour les chemins d'accès
$ ls /e
Suivi de la touche Tabulation se verra auto-compléter le chemin /etc
$ ls /etc
Si l'auto-completion n'agit pas, c'est que le chemin fournit permet plusieurs possibilités. On pourra alors presser la touche Tabulation deux fois de suite afficher les différentes options possibles.
$ ls /etc/h
Suivi d'une double frappe sur la touche Tabulation le résultat pourra donner ceci :
host.conf hostname hosts hosts.allow hosts.deny
Les commandes bénéficient également de l'auto-complétion
fir
suivi de la touche Tabulation
firfox
Les variables bénéficient elles aussi de l'auto-complétion.
echo $LO
suivi de la touche Tabulation
echo $LOGNAME
Il est possible de sauvegarder des settings particuliers de Bash dans un fichier de personnalisation placé dans le répertoire d'accueil de connexion de l'utilisateur pour que ceux-ci soient disponibles à chaque connexion de l'utilisateur.
Si on arrive sur un Shell en ayant entré un mot de passe, c'est que l'on appelle un login-shell.
Par exemple via une console de login, via ssh, via la commande su -, etc.
Dans ce cas le fichier de personnalisation de bash sera ~/.bash_profile (anciennement .profile)
Si on arrive sur un Shell sans avoir entré de mot de passe, c'est que l'on appelle un no-login-shell.
Par exemple quand on ouvre un terminal dans une session graphique, en lançant la commande screen, bash, etc..
Dans ce cas, le fichier de personnalisation de Bash sera ~/.bashrc.
La présence de ces deux fichiers date du temps où il était courant d'utiliser des terminaux série ou autres type de connexion sans gestionnaire de fenêtre (SSH par exemple).
Il était donc intéressant d'avoir des informations complémentaires après son login mais de ne pas l'avoir quand on lançait un terminal depuis un session graphique.
Généralement le fichier ~/.bash_profile fait appel au contenu du fichier ~/.bashrc.
Si ce n'est pas le cas, il suffira alors de rajouter ces quelques lignes dans ~/.bash_profile :
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
En fonction de ce que l'on souhaite avoir, on placera donc ses personnalisations dans l'un ou l'autre des deux fichiers.
Pour personnaliser le Shell, quelque soit le type de connexion, on placera nos modifications dans ~/.bashrc (si le fichier ~/.bash_profile est correctement configuré).
Il est conseillé de placer les modifications directement à la fin des fichiers.