Prof. C.
EL AMRANI Système d’Exploitation UNIX
Le Shell
L’interpréteur de commandes shell est un programme qui gère l’interface utilisateur-système en
faisant exécuter les commandes que l’utilisateur entre au clavier ou qu’il regroupe dans un
fichier dit script shell. Plusieurs syntaxes (shells) existent pour exprimer ces commandes. Il y
en a en gros 2 familles : les Bourne shells (sh, ksh, bash) dérivant du premier interpréteur de
commande sh écrit par Bourne, et les C-shells dérivant d’interpréteurs de commandes
s’inspirant de la syntaxe du C (csh, tcsh). Le shell est un processus comme les autres en Unix,
ce qui explique qu’on peut le changer ou le réécrire. Lors du login, l’utilisateur est connecté
avec un répertoire et un shell définis lors de la création de son compte [le shell peut être changé
à l’aide de la commande chsh].
Dans la suite du cours, on étudiera le shell bash (compatible sh). Le bash permet une édition
facile des lignes de commandes [on retrouve les commandes précédentes avec les touches
flèches du clavier], la gestion d’un historique des commandes [commande history permet de
lister les commandes tapées précédemment, on reexécute une de ces commande en donnant son
numéro précédé de !].
Souvent sh et bash sont rigoureusement le même produit. sh est un lien symbolique vers bash :
ls –l /bin/sh
/bin/sh -> /bin/bash
1. Les variables d’environnement
Les variables d’environnement sont des variables contenant des chaînes de caractère. Il n’y a
pas de déclarations de types comme en C. Ces variables contiennent des informations
utilisables dans différents programmes.
printenv donne la liste des variables d’environnement. Le shell utilise des variables
d’environnement définies dans les fichiers d’initialisation exécutés lors du login. Comme
exemple des variables d’environnement des Bournes shells on trouve :
PWD : contient le répertoire courant
HOME : contient le répertoire d’acceuil
PATH : contient la liste des répertoires où l’interpréteur recherche les fichiers correspondant
aux commandes
TERM indique le type du terminal
SHELL indique le nom du shell utilisé
Echo $VARIABLE permet d’obtenir la valeur de VARAIBLE
Exemple :
echo $PATH
/usr/local/bin : /bin: /usr/bin: /home/etudiant/bin
On peut modifier la valeur de PATH on y ajoutant un nouveau répertoire :
PATH="$PATH : /home/etudiant/ProgC"
1
2 Le Shell
2. Les variables de l’utilisateur (variables du shell)
L’utilisateur peut définir ses propres variables. Il ne doit pas y avoir d’espace autour du signe =.
Exemple :
A=$HOME/ProgC
echo $A
/home/compte1/ProgC
cd $A (on se met dans le répertoire /home/etudiant/ProgC)
Les variables sont locales au processus. La variable A ne sera pas donc connue dans les
programmes exécutés par l’interpréteur de commandes. Pour qu’une variable soit connue dans
les processus fils d’un processus, il faut la déclarer export. Ces variables exportées peuvent être
testées dans un programme C ou dans un script shell.
Exemple :-
export A=/home/etudiant/ProgC
3. Résultats d’une commande
Habituellement, une commande fournit un résultat indiquant si l’exécution s’est bien passée,
par convention 0 pour vrai ; différent de 0 pour faux. Ce résultat peut être testé en utilisant la
variable ? référencée par $?. Ce résultat est fourni par exit dans un script shell.
Exemple :
rm temp.txt (temp.txt n’existe pas)
echo $?
1
4. Les expressions arithmétiques
expr effectue des opérations arithmétiques avec des variables shell. Les opérateurs classiques
sont utilisables : + - * / %. L’opérateur * doit être protégé et écrit \* car il fait partie des
caractères génériques.
Exemple :
N=2
expr $N + 1 (résultat : 3)
expr 3\* 2 (résultat : 6)
En Korn shell et en bash, on peut écrire plus simplement des expressions arithmétiques en
déclarant un type pour les variables (-i pour les entiers).
Exemple :
typeset –i a=2
typeset –i b=3
typeset –i c=$a*$b
echo $c (résultat : 5)
On peut aussi utiliser une structure ((…)) pour manipuler des variables de type entier.
Exemple :
Prof. C. EL AMRANI
3 Le Shell
((a=20))
echo $((a*=5))
(résultat : 100)
((a=20))
((a*=5))
echo $a
(résultat : 100)
5. Les scripts Shell
5.1. Principe
Un script est un ensemble de commandes répertoriées dans un fichier et ayant éventuellement
des paramètres. Le nom de la commande correspond au nom du fichier. Les variables suivantes
sont prédéfinies dans les scripts Shell :
Liste des paramètres d’appel de la commande ($*)
*
Nombre de paramètres lors de l’appel de la commande ($#)
#
Numéro du processus courant ($$)
$
! Numéro du dernier processus en arrière plan ($ !)
? Valeur du code de retour de la dernière commande exécutée ($?)
Exemple :
echo $$ (résultat 1870)
Exemple de script :
Soit le script : script1
#!/bin/bash chemin d’accès du shell bash
clear efface l’écran
echo -n "Repertoire courant: "; pwd affiche le répertoire courant
date +"%d/%m/%Y a %Hh%M" affiche la date
echo -n "Nmbre de fichiers: " ; ls | wc –l affiche le nombre de fichiers dans le répertoire
courant, « n » pour afficher sur la même ligne
Il faut rendre le fichier exécutable avec :
chmod u+x script1
exécuter avec : ./script1
si on ajoute dans PATH le répertoire ou se trouve script1, ce dernier pourra être lancé de
Prof. C. EL AMRANI
4 Le Shell
n’importe quel répertoire : PATH= "$PATH:$HOME/scripts" (sachant que script1 se trouve
dans le répertoire /scripts)
Exécution de script1 :
29/11/2021 a 12h15
Repertoire courant: /home/compte5/scripts
Nombre de fichiers: 1
Prof. C. EL AMRANI