Shell
par
popularité : 2%
VIII. Le shell :
Les Shells sont des interpréteurs de commandes qui permettent à un utilisateur de "dialoguer" avec le système d'exploitation de la machine (donner des ordres et récupérer les résultats).
Il existe plusieurs shells standards sous UNIX:
sh (Bourne Shell) le shell de référence
csh (C Shell ) syntaxe proche du langage C (+ alias + historique des commandes)
ksh (Korn Shell) (alias + historique) avec compatibilité sh
sh (Posix Shell) standard - peu de différence avec le ksh
les shells restreints, dérivés des précédents mais possédant des fonctionnalités fortement limitées (par exemple, la commande cd n'existe plus).
Lorsqu'il exécute une ligne de commande, un shell travaille en deux étapes : il interprète d'abord les caractères spéciaux, puis il cherche la commande qu'il doit exécuter.
A. Les variables
Une variable est une chaîne de caractère (définie dans l'espace de données d'un processus) à laquelle est associée une valeur.
Le shell utilise un certain nombre de variables qui déterminent en partie son comportement.
Le shell est dans sa configuration standard non déclaratif, c'est-à -dire qu'il n'est pas nécessaire de déclarer une variable avant de l'utiliser.
1. Initialiser/évaluer une variable
Par défaut, les variables sont de type chaîne ; elles peuvent néanmoins être interprétées comme des entiers dans certains cas (par exemple lors de calculs).
On peut les créer ou modifier leurs valeurs en utilisant l'opérateur d'affectation "=". Il ne faut surtout pas mettre de blanc de chaque coté du caractère "=" .
La valeur (ou le contenu) d'une variable peut être récupéré(e) en préfixant le nom de la variable par le symbole $. On parle de substitution de variable.
Exemples :
$ VAR="Unix est beau" # ' NE PAS METTRE D'ESPACE AUTOUR du "=" '
$ echo $VAR
Unix est beau
2. Variables locales / d’environnement
Comme tout processus Unix un shell possède un espace mémoire contenant entre autres des variables.
Ces variables sont rangées dans différents ensembles :
l'ensemble des variables locales, propres au processus,
l'ensemble des variables d'environnement : il s’agit de l’ensemble des variables qui seront héritées par les éventuels processus fils.
3.
Manipulation de variables : les commandes set, unset et env<
$ unset VAR détruit la variable VAR.
$ set affiche toutes les variables (privée + env) du shell.
$ env affiche les variables de l'environnement.
$ export Toto transfère la variable Toto dans l'environnement.
4. Les principales variables du shell
Certaines variables du shell sont prépositionnées. Voici les principales, ainsi que leur signification :
TMOUT |
si ¹ de 0, nombre de secondes avant logout automatique |
|
HOME |
répertoire de connexion |
|
TZ |
fuseau horaire |
|
MANPATH |
répertoires où man cherche les fichiers d'aides |
|
LINES |
nombre de lignes |
|
COLUMNS |
nombre de colonnes |
|
|
nom du fichier de stockage du courrier |
|
MAILCHECK |
fréquence (en secondes) de vérification de la boîte aux lettres |
|
HISTFILE |
nom du fichier de stockage des commandes |
|
HISTSIZE |
nombre de lignes de HISTSIZE |
|
IFS |
séparateurs de mots de la ligne de commande |
|
SHELL |
nom du shell de connexion |
|
LOGNAME |
login de connexion |
|
PS1 |
prompt primaire (invite du shell) (# pour root=super user) |
|
PS2 |
prompt secondaire (suite commande incomplete) |
|
PWD |
répertoire courant (mis à jour pour chaque cd avec ksh) |
|
PATH |
répertoires d'accès aux commandes |
|
TERM |
type de terminal |
Pour connaître la signification des autres variables du shell telles que LANG , DISPLAY , TMOUT , ... , il suffit d'activer l'aide en ligne sur le shell (man sh-posix).
5. Caractères de protections
\ |
Le caractère qui suit perd son rôle fonctionnel |
' ' |
Tous les caractères situés entre les simples quotes perdent leur rôle fonctionnel |
" " |
Tous les caractères situés entre les doubles quotes perdent leur rôle fonctionnel sauf : |
$ |
Valeur de variable |
commande |
Substitution de commande |
Exemples:
$ echo * fifi loulou rep repbis riri $ echo \* * $ echo "Type de terminal : $TERM " Type de terminal : vt220 $ echo 'Type de terminal : $TERM ' Type de terminal : $TERM $ echo "Type de terminal : \$ $TERM \$" Type de terminal : $ vt220 $ $ echo "La date est La date est Sat Dec 16 15:58:39 GMT 1995 $ echo 'La date est La date est $ |
6. Affectation du résultat d'une commande
Substitutions de commandes peut-être utile de récupérer le résultat d'une commande dans une variable ; deux syntaxes sont possibles :
commande
Le résultat de la commande est inséré dans la liste d'arguments- $(commande) Autre notation possible en Korn-shell. Permet les imbrications
L'ancienne : utilisation de </b></p>
<p>Exemple : $ CPATH=
pwd</p>
<p>$ echo $CPATH</p>
<p>/users/user1</p>
<u>
<p>La "nouvelle"</u> (découlant des normes POSIX) : utilisation de <b>$(
)</p>
</b>
<p>Exemple : $ CPATH=<b>$(</b>pwd<b>)
</b>
</p>
<p> </p>
<h2><a NAME="b">B. Evaluation d’expressions
mathématiques</a></h2>
<p>La commande <b>let</b> permet d’effectuer des calculs, en utilisant les
opérateurs suivants :</p>
<table border="1">
<tr>
<td width="27">+</td>
<td width="96"> addition</td>
</tr>
<tr>
<td width="27">-</td>
<td width="96"> soustraction</td>
</tr>
<tr>
<td width="27">\*</td>
<td width="96"> multiplication</td>
</tr>
<tr>
<td width="27">/</td>
<td width="96"> division</td>
</tr>
</table>
<p> </p>
<p> </p>
<p>Les syntaxes:</p>
<p><b>let</b> <i>expression</i> est équivalent à <b>((</b> <i>expression</i> <b>))</p>
</b>
<p>sont strictement équivalents.</p>
<i>
<p>Exemples :</p>
</i>
<p>$ x=4</p>
<p>$ <b>let</b> x=x+1 <i># pas d'utilisation du "$"</p>
</i>
<p>$ echo $x</p>
<p>5</p>
<p ALIGN="JUSTIFY">$ (( y = x / 2 )) ; echo $y</p>
<p ALIGN="JUSTIFY">2</p>
<p ALIGN="JUSTIFY">$ let "z = x %2" ; echo $z</p>
<p ALIGN="JUSTIFY">1</p>
<font SIZE="4">
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY"> </p>
</font>
<h2><a name="c">C. Fonctionnalités du Korn Shell</a></h2>
<p> </p>
<h3><font COLOR="#7f007f"><a NAME="1-">1. Substitution du
"tilde"</a></font></h3>
<b>
<p ALIGN="JUSTIFY">~</b> est remplacé par le répertoire de connexion,</p>
<b>
<p ALIGN="JUSTIFY">~user</b> est remplacé par le répertoire de
connexion de l'utilisateur <i>user</i>.</p>
<i>
<b><u><font SIZE="4" COLOR="#7f007f">
<p><a NAME="_Toc379030953"></p>
</a></font></u></b>
</i>
<h3><a NAME="2-"><font COLOR="#7f007f">2. Les alias</font></a></h3>
<b>
<p ALIGN="JUSTIFY">alias</b> permet de définir simplement de nouvelles
commandes (abrégées)</p>
<font SIZE="4">
<p ALIGN="JUSTIFY"> </p>
</font><i>
<p ALIGN="JUSTIFY">Exemples :</i> </p>
<table border="1">
<tr>
<td width="100%">
<p ALIGN="JUSTIFY"> $ alias qui=’who | cut -c-8’ <i>définit
un nouvel alias</p>
</i>
<p ALIGN="JUSTIFY">$ alias h=history</p>
<p ALIGN="JUSTIFY">$ alias del='rm -i'</p>
<p ALIGN="JUSTIFY">$ unalias h <i>détruit l'alias h</p>
</i>
<p ALIGN="JUSTIFY">$ alias <i>affiche la liste des alias</p>
</i>
</td>
</tr>
</table>
<i>
<b>
<p> </p>
</b></i>
<h3><a NAME="3-">3. Fichiers d'initialisation</a></h3>
<p ALIGN="JUSTIFY">Lors de la connexion d'un utilisateur utilisant un Korn
shell, les fichiers lus successivement sont :</p>
<i>
<ul>
<li>
<p ALIGN="JUSTIFY">/etc/profile</i>, contenant la configuration
commune aux utilisateurs,</li>
<i>
<li>
<p ALIGN="JUSTIFY">$HOME/.profile</i>, où l'utilisateur peut
personnaliser son environnement (umask, modification de PS1, ...)</li>
</ul>
<font SIZE="4">
<p ALIGN="JUSTIFY"> </p>
</font>
<p ALIGN="JUSTIFY">De plus, si la variable <b>ENV</b> contient un nom de
fichier lisible, ce dernier sera lu (ainsi qu'au lancement de shells fils).
Conventionnellement, il s'agit de <i>$HOME/.kshrc</i>.</p>
<font SIZE="4">
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY"> </p>
</font>
<p ALIGN="CENTER"><img SRC="/base/shell1.gif" width="357" height="377" ></p>
<p ALIGN="JUSTIFY">connecté...</p>
<font SIZE="4">
<p ALIGN="JUSTIFY"> </p>
</font>
<h3><a NAME="4-">4. Historique des
commandes</a></h3>
<b><i>
<p>a) Utilisation de la variable EDITOR</p>
</i></b>
<p ALIGN="JUSTIFY">La variable <b>EDITOR</b> peut contenir le nom d'un
éditeur (vi, emacs, ...) ; dans ce cas, le fichier <i>.sh_history </i>est
édité à l'aide d'une version mono-ligne de l'éditeur spécifié après
avoir appuyé sur la touche ESC. Cette édition s'effectue à partir de la
dernière ligne de <i>.sh_history</i> (c'est-à -dire en rappelant les
commandes les plus récentes d'abord). On utilise en général EDITOR=vi</p>
<font SIZE="4">
<p ALIGN="JUSTIFY"> </p>
</font>
<p ALIGN="JUSTIFY">$ <b>ESC</b> <i>Edite le fichier .sh_history ligne
par ligne avec <b>vi</b>. L'utilisation des commandes de cet éditeur
permet de modifier une ligne de commande.</p>
</i>
<p ALIGN="JUSTIFY"><b>k </b><i>récupérer les commande à partir de la
plus récente,</p>
<p ALIGN="JUSTIFY"></i><b>l,h</b> <i>déplacement sur la ligne</p>
<p ALIGN="JUSTIFY"></i><b>a, i</b> <i>passage en mode insertion</p>
<p ALIGN="JUSTIFY"></i>...</p>
<b><i><u><font SIZE="4" COLOR="#7f007f">
<p> </p>
</font></u>
</i></b>
<h3><a name="5-">5. Les méta caractères :</a></h3>
<p>Une des premières fonctions du shell est d'<b>interpréter un certain nombre
de caractères</b> <b>avant l'appel des commandes</b>.</p>
<p>Il est à noter que <b>les commandes Unix ne traitent pas les caractères
spéciaux</b>.</p>
<p>Elles héritent d'une liste de paramètres déjà résolue et ne se
préoccupent pas de mécanismes comme les redirections ou le «pipeline».</p>
<p>Ce principe de base favorise grandement l’activité de programmation et s’inscrit
parfaitement dans la démarche «boîte à outils» modulaire voulue par les
concepteurs du système.</p>
<b><i>
<p>Rappel des caractères déjà évoqués</p>
</i></b>
<table border="1" width="311">
<tr>
<td width="67"><</td>
<td width="228"> Redirection de l'entrée standard</td>
</tr>
<tr>
<td width="67">> et >></td>
<td width="228"> Redirections de la sortie standard</td>
</tr>
<tr>
<td width="67">2> et 2>></td>
<td width="228">
<p> Redirections de l'erreur standard</p>
</td>
</tr>
<tr>
<td width="67">; </td>
<td width="228">
<p> Processus séquentiels</p>
</td>
</tr>
<tr>
<td width="67">| </td>
<td width="228">
<p> Mécanisme du «pipeline»</p>
</td>
</tr>
<tr>
<td width="67">&</td>
<td width="228">
<p> Mode arrière-plan</p>
</td>
</tr>
<tr>
<td width="67">( )</td>
<td width="228">
<p> Grouper des commandes</p>
</td>
</tr>
<tr>
<td width="67">=</td>
<td width="228">
<p> Affectation de variable</p>
</td>
</tr>
<tr>
<td width="67">$</td>
<td width="228"> Contenu d'une variable</td>
</tr>
</table>
<p> </p>
<b><i>
<p>Désignations abrégées de noms de fichiers</p>
</i></b>
<table border="1">
<tr>
<td width="21%"><i>* </i></td>
<td width="79%">N'importe quelle chaîne dans un nom de fichier Utilisé seul, signifie : «Tous les fichiers du répertoire courant»
( Ne sélectionne pas les fichiers commençant par . ( point ) )</td>
</tr>
<tr>
<td width="21%"><i>?</i> </td>
<td width="79%"> Présence d’un caractère quelconque dans un nom de fichier</td>
</tr>
<tr>
<td width="21%"><i>[ensemble_caractères]</i> </td>
<td width="79%"> Présence d’un caractère de l’ensemble</td>
</tr>
<tr>
<td width="21%">
<p><i>[!ensemble_caractères]</i> </p>
</td>
<td width="79%"><p> Présence d’un caractère ne figurant pas
dans l’ensemble</p>
</td>
</tr>
</table>
<p> </p>
<p>Exemple :</p>
<table border="1">
<tr>
<td width="100%">
<p>$ <b><i>echo *</p>
</i></b>
<p>fifi loulou rep repbis riri</p>
<p>$ <b><i>echo .??*</p>
</i></b>
<p>.exrc .profile .sh_history</p>
<p>$ <b><i>ls -l .[!.]*</p>
</i></b>
<p>-rw-r--r-- 1 stage1 stage 38 Oct 16 18:51 .exrc</p>
<p>-rwxr-xr-x 1 stage1 stage 390 Oct 17 10:49 .profile</p>
<p>-rw------- 1 stage1 stage 2736 Dec 16 15:27 .sh_history</p>
</td>
</tr>
</table>
<p> </p>
<p>Résumé :</p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="4" WIDTH="614">
<tr>
<td WIDTH="21%" VALIGN="TOP" BGCOLOR="#ffffff"><i>
<p ALIGN="CENTER">Caractères</i></td>
<td WIDTH="7%" VALIGN="TOP" BGCOLOR="#ffffff"> </td>
<td WIDTH="72%" VALIGN="TOP" BGCOLOR="#ffffff"><i>
<p ALIGN="CENTER">Signification</i></td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP">
<p>" ' \</td>
<td WIDTH="7%" VALIGN="TOP"> </td>
<td WIDTH="72%" VALIGN="TOP">
<p>Déspécialisation des caractères interprétés par le shell.</td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP">
<p>< espace> < tab></p>
<p>< retour chariot ></td>
<td WIDTH="7%" VALIGN="TOP"> </td>
<td WIDTH="72%" VALIGN="TOP">
<p>Séparateurs de mots.</td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP">
<p>; && ||</td>
<td WIDTH="7%" VALIGN="TOP"> </td>
<td WIDTH="72%" VALIGN="TOP">
<p>Enchaînement de commandes</td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP">
<p>* ? [! - ]</td>
<td WIDTH="7%" VALIGN="TOP"> </td>
<td WIDTH="72%" VALIGN="TOP">
<p>Génération automatique de noms de fichiers.</td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP">
<p>< << > >> >|</p>
<p><& <- >& >-</td>
<td WIDTH="7%" VALIGN="TOP"> </td>
<td WIDTH="72%" VALIGN="TOP">
<p>Redirection et duplication des entrées / sorties.</td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP">
<p>$ ${ }</td>
<td WIDTH="7%" VALIGN="TOP"> </td>
<td WIDTH="72%" VALIGN="TOP">
<p>Substitution de variable.</td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP">
<p>$( )
Substitution de commande.
&
Lancement de commande en arrière plan
#
Commentaire.
( )
Sous-environnement.
~ ~login ~+ ~-
Substitution de répertoire.