Shell
par
popularité : 1%

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 `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 `
Exemple : $ CPATH=`pwd`
$ echo $CPATH
/users/user1
La "nouvelle" (découlant des normes POSIX) : utilisation de $( )
Exemple : $ CPATH=$(pwd)
B. Evaluation d’expressions mathématiques
La commande let permet d’effectuer des calculs, en utilisant les opérateurs suivants :
+ | addition |
- | soustraction |
\* | multiplication |
/ | division |
Les syntaxes:
let expression est équivalent à (( expression ))
sont strictement équivalents.
Exemples :
$ x=4
$ let x=x+1 # pas d'utilisation du "$"
$ echo $x
5
$ (( y = x / 2 )) ; echo $y
2
$ let "z = x %2" ; echo $z
1
C. Fonctionnalités du Korn Shell
1. Substitution du "tilde"
~ est remplacé par le répertoire de connexion,
~user est remplacé par le répertoire de connexion de l'utilisateur user.
2. Les alias
alias permet de définir simplement de nouvelles commandes (abrégées)
Exemples :
$ alias qui=’who | cut -c-8’ définit un nouvel alias $ alias h=history $ alias del='rm -i' $ unalias h détruit l'alias h $ alias affiche la liste des alias |
3. Fichiers d'initialisation
Lors de la connexion d'un utilisateur utilisant un Korn shell, les fichiers lus successivement sont :
-
/etc/profile
$HOME/.profile
De plus, si la variable ENV contient un nom de fichier lisible, ce dernier sera lu (ainsi qu'au lancement de shells fils). Conventionnellement, il s'agit de $HOME/.kshrc.
connecté...
4. Historique des commandes
a) Utilisation de la variable EDITOR
La variable EDITOR peut contenir le nom d'un éditeur (vi, emacs, ...) ; dans ce cas, le fichier .sh_history 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 .sh_history (c'est-à -dire en rappelant les commandes les plus récentes d'abord). On utilise en général EDITOR=vi
$ ESC Edite le fichier .sh_history ligne par ligne avec vi. L'utilisation des commandes de cet éditeur permet de modifier une ligne de commande.
k récupérer les commande à partir de la plus récente,
l,h déplacement sur la ligne
a, i passage en mode insertion
...
5. Les méta caractères :
Une des premières fonctions du shell est d'interpréter un certain nombre de caractères avant l'appel des commandes.
Il est à noter que les commandes Unix ne traitent pas les caractères spéciaux.
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».
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.
Rappel des caractères déjà évoqués
< | Redirection de l'entrée standard |
> et >> | Redirections de la sortie standard |
2> et 2>> |
Redirections de l'erreur standard |
; |
Processus séquentiels |
| |
Mécanisme du «pipeline» |
& |
Mode arrière-plan |
( ) |
Grouper des commandes |
= |
Affectation de variable |
$ | Contenu d'une variable |
Désignations abrégées de noms de fichiers
* | 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 ) ) |
? | Présence d’un caractère quelconque dans un nom de fichier |
[ensemble_caractères] | Présence d’un caractère de l’ensemble |
[!ensemble_caractères] |
Présence d’un caractère ne figurant pas dans l’ensemble |
Exemple :
$ echo * fifi loulou rep repbis riri $ echo .??* .exrc .profile .sh_history $ ls -l .[!.]* -rw-r--r-- 1 stage1 stage 38 Oct 16 18:51 .exrc -rwxr-xr-x 1 stage1 stage 390 Oct 17 10:49 .profile -rw------- 1 stage1 stage 2736 Dec 16 15:27 .sh_history |
Résumé :
Caractères |
Signification |
|
" ' \ |
Déspécialisation des caractères interprétés par le shell. |
|
< espace> < tab> < retour chariot > |
Séparateurs de mots. |
|
; && || |
Enchaînement de commandes |
|
* ? [! - ] |
Génération automatique de noms de fichiers. |
|
< << > >> >| <& <- >& >- |
Redirection et duplication des entrées / sorties. |
|
$ ${ } |
Substitution de variable. |
|
$( ) ` |
Substitution de commande. |
|
& |
Lancement de commande en arrière plan |
|
# |
Commentaire. |
|
( ) |
Sous-environnement. |
|
~ ~login ~+ ~- |
Substitution de répertoire. |