Shell

mardi 16 septembre 2008
par  Jerome ROBERT
popularité : 13%

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

MAIL

 

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 date"

La date est Sat Dec 16 15:58:39 GMT 1995

$ echo 'La date est date'

La date est date

$

 

 

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 &quot;nouvelle&quot;</u> (découlant des normes POSIX) : utilisation de <b>$( )</p> </b> <p>Exemple : $ CPATH=<b>$(</b>pwd<b>) </b>    </p> <p>&nbsp;</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>&nbsp;</p> <p>&nbsp;</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 &quot;$&quot;</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 &quot;z = x %2&quot; ; echo $z</p>    <p ALIGN="JUSTIFY">1</p>    <font SIZE="4">    <p ALIGN="JUSTIFY">&nbsp;</p>    <p ALIGN="JUSTIFY">&nbsp;</p>    <p ALIGN="JUSTIFY">&nbsp;</p>    </font>    <h2><a name="c">C. Fonctionnalités du Korn Shell</a></h2>    <p>&nbsp;</p>    <h3><font COLOR="#7f007f"><a NAME="1-">1. Substitution du    &quot;tilde&quot;</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">&nbsp;</p>      </font><i>    <p ALIGN="JUSTIFY">Exemples :</i> &nbsp;</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>&nbsp;</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">&nbsp;</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">&nbsp;</p>    <p ALIGN="JUSTIFY">&nbsp;</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">&nbsp;</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">&nbsp;</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>&nbsp;</p>          </font></u>      </i></b>        <h3><a name="5-">5. Les méta caractères&nbsp;:</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">&lt;</td>          <td width="228"> Redirection de l'entrée standard</td>        </tr>        <tr>          <td width="67">&gt; et &gt;&gt;</td>          <td width="228"> Redirections de la sortie standard</td>        </tr>        <tr>          <td width="67">2&gt; et 2&gt;&gt;</td>          <td width="228"> <p>&nbsp;Redirections de l'erreur standard</p>          </td>        </tr>        <tr>          <td width="67">;&nbsp;</td>          <td width="228"> <p> Processus séquentiels</p>          </td>        </tr>        <tr>          <td width="67">|&nbsp;</td>          <td width="228"> <p> Mécanisme du «pipeline»</p>          </td>        </tr>        <tr>          <td width="67">&</td>          <td width="228"> <p>&nbsp;Mode arrière-plan</p>          </td>        </tr>        <tr>          <td width="67">( )</td>          <td width="228"> <p>&nbsp;Grouper des commandes</p>          </td>        </tr>        <tr>          <td width="67">=</td>          <td width="228"> <p>&nbsp;Affectation de variable</p>          </td>        </tr>        <tr>          <td width="67">$</td>          <td width="228"> Contenu d'une variable</td>        </tr>      </table> <p>&nbsp;</p> <b><i> <p>Désignations abrégées de noms de fichiers</p> </i></b>      <table border="1">        <tr>          <td width="21%"><i>*&nbsp; </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%">&nbsp;Présence d’un caractère de l’ensemble</td>        </tr>        <tr>          <td width="21%"> <p><i>[!ensemble_caractères]</i> &nbsp;</p>          </td>          <td width="79%"><p> Présence d’un caractère ne figurant pas dans l’ensemble</p>          </td>        </tr>      </table> <p>&nbsp;</p> <p>Exemple&nbsp;:</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>&nbsp;</p> <p>Résumé&nbsp;:</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">&nbsp;</td>    <td WIDTH="72%" VALIGN="TOP" BGCOLOR="#ffffff"><i>      <p ALIGN="CENTER">Signification</i></td>  </tr>  <tr>    <td WIDTH="21%" VALIGN="TOP">      <p>&quot; ' \</td>    <td WIDTH="7%" VALIGN="TOP">&nbsp;</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>&lt; espace&gt; &lt; tab&gt;</p>      <p>&lt; retour chariot &gt;</td>    <td WIDTH="7%" VALIGN="TOP">&nbsp;</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">&nbsp;</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">&nbsp;</td>    <td WIDTH="72%" VALIGN="TOP">      <p>Génération automatique de noms de fichiers.</td>  </tr>  <tr>    <td WIDTH="21%" VALIGN="TOP">      <p>&lt; &lt;&lt; &gt; &gt;&gt; &gt;|</p>      <p>&lt;& &lt;- &gt;& &gt;-</td>    <td WIDTH="7%" VALIGN="TOP">&nbsp;</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">&nbsp;</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.