IV. Le Shell
1. Présentation
a. Fonctionnement
b. Syntaxe
2. Scripts
3. Communication interprocessus aux moyens des entrées/sorties
a. | Tube (pipe en anglais)
b. Exécutions conditionnelles
c. Liste
d. Groupement : { liste;}
e. Substitution de commandes
f. Substitution de paramètres (ou variables)
g. Génération de noms de fichiers
4. Les variables
a. Variables d'environnement
b. Paramètres internes d'un shell
5. Redirections d'entrées/sorties
a. Les différents types de redirections
b. Instructions
c. Fonctions
d. Test de fichiers
e. Autres tests
f. Tests binaires
6. Commandes internes de sh
a. Commandes importantes
b. Autres commandes
IV. Le shell
1. Présentation
Il y a deux familles de shell :
  • le Bourne-shell (sh) :
    • z-shell (zsh).
    • Bash.
    • ksh.
  • le c-shell (csh) :
    • tcsh.
a. Fonctionnement
New Line correspond au retour à  la ligne (généralement la touche Entrée).
Fonctionnement

b. Syntaxe
Exécution séquentielle :
% commande1 ; commande2
La suite de commande : % commande1 ; commande2 ; commande3 correspond à  la séquence :
% commande1
% commande2
% commande3
Exécution en tache de fond :
% commande &
Exécution asynchrone :
% commande1 & commande2
2. Scripts
Un script correspond à  une suite de commandes écrite dans un fichier.
Exemple :
Prog
#! /bin/sh______# interpréteur
commande1
commande2___# même chose que : commande1; commande2
Si on ne veut pas que NL (New Line) soit interprète, il suffit de mettre un "\ ".
Exemple :
Prog
#! /bin/sh
commande\
Suite de la commande très longue
Pour exécuter le script (ici Prog), il suffit de taper son nom :
% Prog <NL>
3. Communication interprocessus aux moyens des entrées/sorties
a. | Tube (pipe en anglais)

commande1 | commande2
La sortie standard de commande1 est envoyée sur l'entrée standard de commande2 (par un tube). commande1 est exécutée de manière asynchrone par rapport à  commande2.
Attention :
commande1 | commande2 | commande1 n'est pas une boucle. Ce sont trois processus distincts. C'est la même chose que commande1 | commande2 | commande3 avec commande3=commande1. C'est ce que l'on appelle un tuyau (pipeline).
b. Exécutions conditionnelles
&& et || sont des opérateurs binaires.
Remarque :
On peut obtenir le code de sortie d'un processus par le biais de la commande exit.
exit (n) en C
exit n en sh
Si n=0, alors le processus s'est déroulé sans erreur
Sinon il y a eu une erreur correspondant au code de sortie n.
% commande1 && commande2 && commande3
commande2 s'exécute ssi le code de sortie de commande1 vaut 0. De même commande3 s'exécute ssi le code de sortie de commande2 vaut 0.
% commande1 || commande2 || commande3
commande2 s'exécute ssi le code de sortie de commande1 est diffèrent de 0. De même commande3 s'exécute ssi le code de sortie de commande2 est diffèrent de 0.

c. Liste
Commandes ou pipelines séparées par |, &, ;, &&, || :
|
& ;
&& ||
Ordre
de priorité
décroissante.
Exemple :
Pour % commande1 & commande2 | commande3 && commande4, on aura :
commande1 exécutée de manière asynchrone (&)
commande2 exécutée de manière asynchrone aussi (propriété du tube)
commande3 reçoit la sortie de commande2
commande4 est exécutée si commande3 s'est bien passée. Son entrée standard est commande2 (elle est la sortie standard de commande2).
d. Groupement : { liste;}

Permet de "choisir" les priorités, comme les parenthèses en mathématiques.
La ligne : % commande1 & { commande2|commande3;} && commande4 correspond à  :
commande1 & (commande2|commande3) && commande4
e. Substitution de commandes
% ...`......`...
Le shell interprète d'abord la partie entre ``.
Exemple :
Truc
ls
% `cat Truc` correspond à  : % ls
% nis `cat Truc` passwd.org_dir correspond à  : % nisls passwd.org_dir
Pour avoir des substitutions de commandes imbriquées :
% ...`...\`.....\`.....`...
La partie entre "\ " sera interprétée d'abord puis la partie entre ``.
Exemple :
% which ls
/bin/ls
% which `cat Truc`
/bin/ls
% rm `which \`cat truc \`` correspond à  : % rm /bin/ls
f. Substitution de paramètres (ou variables)
Syntaxe :
%var=qcq # affectation et création, si la variable n'existe pas
Remarque :
`` et " " correspondent à  la chaine vide.
La commande unset permet de détruire une variable :
% unset var

Utilisation d'une variable (substitution) :
% ... $var ... # var est remplacée par sa valeur
Exemple :
% var=debut
% echo $var
debut
% echo $varant
(aucun résultat)
% echo ${var}ant
debutant
g. Génération de noms de fichiers

Pour cela on utilise les caractères suivants :
* [ ] ! - pour les noms de fichiers ou chemins.

* correspond à  toute chaine
[...] correspond à  un ensemble de caractères

Exemple :
[%ab] correspond à  {%, a, b}
[a-z] correspond à  {a, b, c, ...,z}
[0-9] correspond à  {0,1, ...,9}
[A-Z] correspond à  {A, B, C, ...,Z}

[ !....] correspond au complément (d'un ensemble de caractères donné).
Exemple :
[ !A-Za-z0-9] correspond à  tout caractère qui n'est ni une lettre, ni un chiffre.

Des combinaisons sont possibles.
Exemple :
[c-fAX-Z] correspond à  {c, d, e, f, A, X, Y, Z}
*[0-9]* toute chaine qui contient au moins un chiffre.
* au début d'une expression ne représente pas de chaine commençant par . ou /
Exemple d'utilisation avec des commandes :
% echo /b*
/bin/boot
% rm /b* suppression des fichiers commençant par b ou des répertoires vides commençant par b
% ls
prog.c prog.o .nfs0715 .nfs0716 .pp
% rm [/.]p* supprime les fichiers commençant par .p ou les répertoires vides commençant par /p. Ici seul le fichier .pp est concerné.
4. Les variables
Paramètres (variables) Variables d'environnement
(généralement en majuscules)
Ex : PATH
Les variables


a. Variables d'environnement
Marquer une variable permet de l'ajouter aux variables d'environnements (pour transmission au fils).

Commande pour marquer une variable : export.
% MA_VARIABLE=valeur
% export MA_VARIABLE

Exemple de variables d'environnement :
HOME : Chemin d'accès de votre répertoire d'accueil.
PATH : liste des répertoires a parcourir pour trouver un programme.
Habituellement on a PATH=.:/usr/dt/bin:/usr/openwin/bin:/usr/local/X11RS: /soft/SUNW/Spro/bin:/usr/... Les différents répertoires sont séparés par :. Ce sont les répertoires du PATH ,ordonnés.
SHELL : chemin d'accès du programme shell (zsh par exemple).
USER : identifiant de l'utilisateur connecté.
b. Paramètres internes d'un shell
Elles ne peuvent pas être exportées, ce ne sont pas des variables d'environnement. L'affectation "= " ne marche pas. 5. Redirections d'entrées/sorties
Généralement le shell a trois fichiers ouverts, correspondants à  trois descripteurs (parfois appelés canaux) :
  • Le descripteur 0 : entrée standard
  • Le descripteur 1 : sortie standard
  • Le descripteur 2 : sortie d'erreur
Remarque :
Il existe toutefois sept canaux supplémentaires configurables en entrée ou en sortie (de 3 à  9).
Quelles que soient leurs positions dans la ligne de commande, les redirections sont traitées en premier par le shell.
Exemple :
% prog >fichier bonjour
est identique a :
% prog bonjour >fichier

a. Les différents types de redirections
b. Instructions c. Fonctions
L'intérêt d'une fonction est que l'on peut en mettre plusieurs dans un script afin de gérer des répetitions de commandes (ou de groupes de commandes). d. Test de fichiers
Si le fichier existe et... :
  • -r :est lisible
  • -w :l'écriture est possible
  • -x :exécutable
    Exemple :
    if [ -r $2 ] ;then
    ...
    ...
    else
    echo "$0 :vous n'avez pas le droit de lire le fichier $2">&2
    fi
  • -f :est un fichier ordinaire
  • -d :est un répertoire
  • -p :est une représentation interne d'un dispositif de communication
  • -c :est un pseudo-fichier du type accès caractère par caractère
  • -b :est un pseudo-fichier du type accès par bloc
  • -L :est un lien symbolique
  • -u : son Set UID=1
  • -g :son Set GID=1
  • -k :son Sticky Bit=1
  • -S :est non-vide
e. Autres tests f. Tests binaires 6. Commandes internes de sh
a. Commandes importantes
return
shift
set
export
break
continue


Les quatre premières commandes ont déjà  été présenté dans les chapitres précédents.
break n :
Permet de sortir d'une boucle en allant au niveau n.
Exemple :
for...
while...
...
...
break 2
...
...
done
...
done
... # on se retrouve alors ici


continue n :
Permet de passer à  la prochaine occurrence d'une boucle au niveau n
Exemple :
while...
for...
...
...
continue 2 # Renvoie à  la prochaine occurrence du while
...
...
done
...
done
...
b. Autres commandes a connaitre
cd :
  • cd répertoire :permet de modifier le répertoire courant
  • cd :permet de revenir au répertoire personnel (habituellement celui indiqué par la variable HOME).
echo :
  • echo chaine :affiche la chaine par la sortie standard.
  • echo $variable :affiche la valeur de variable.
eval :
Permet l'évaluation d'une ligne de commande.
Exemple :
%a='Ceci est un exemple'
%b=a
%echo $b
a
%echo \$$b
$a
%eval echo \$$b
Ceci est un exemple

%c=\$$b
%echo $c
$a
%eval c=\$$b
%echo $c
Ceci est un exemple
read :
read variable1 variable2 ...variablen
Le premier mot lu sera associé à  variable1
Le second mot lu sera associé à  variable2
...
Le n-1éme mot lu sera associé à  variable(n-1)
...et tous les mots lus après le n-1eme seront associés à  la variable n.
pwd :affiche le répertoire courant.

type nom : affiche la commande détaillée liée a nom.

trap :
  • trap argument n1 ...ni :si les signaux n1 ...ni arrivent alors argument sera exécuté.
    Exemple :
    %trap '' INT # INT correspond à  Ctrl-C
    Après cette commande ,Ctrl-C n'aura plus aucune action.
  • trap n1...ni :remet les dispositions par défaut.
    Exemple :
    %trap INT
  • trap : affiche les dispositions associées aux signaux
umask :
  • umask xyz :permet de définir le masque pour tous les fichiers nouvellement créés. A l'origine les nouveaux fichiers sont dotés des droits : -rw-rw-rw- et les nouveaux répertoires des droits : -rwxrwxrwx. La valeur octale xyz associée à  umask est soustraite de la valeur existante.
    Exemple :
    %umask 022
    Après cette commande tous les fichiers nouvellement créés auront les droits suivants : -rw-r--r--et les nouveaux répertoires les droits : -rwxr-xr-x.
  • umask : permet de connaitre le masque actif.
  • Pour modifier les droits des fichiers existants il faut utiliser la commande chmod.