Académique Documents
Professionnel Documents
Culture Documents
Programmation Shell
1 INTRODUCTION 3
1 Introduction
1.1 Historique
L’histoire d’Unix débute dans les années 60 et peut être résumée de la façon suivante :
â 1966 :
les laboratoires Bell (filiale de AT&T) ont besoin pour leur usage interne, d’un système
d’exploitation pour le traitement de textes et le développement d’applications. Ken Thomson
et son équipe sont chargés de ce travail.
â 1969 :
apparition de la première version d’Unix.
Le nom UNIX provient de UNICS (UNiplexed Information and Computing System), système
d’exploitation qui a succédé à Multics dans les laboratoires Bell.
â 1972 :
Kernighan et Ritchie créent le langage C pour faciliter le portage d’Unix.
â 1973 :
nécessité de rendre Unix portable sur d’autres ordinateurs. Denis Ritchie réécrit alors entièrement
Unix en langage C qui a d’ailleurs été créé dans ce but précis (Kernighan et Ritchie).
â 1974 :
AT&T propose les premières licences aux universités (système Unix complet avec son code
source) à des fins éducatives. Il s’en suivra un enrichissement en extensions et en utilitaires
variés à Unix (en particulier, université de Berkeley).
C’est le début de la popularité et la diversité d’Unix.
â 1978 :
AT&T présente à l’industrie des premières versions commerciales (version 6 d’Unix).
â années 80 :
AT&T autorise le clonage d’Unix par d’autres constructeurs. Apparaissent alors ULTRIX
sur DEC, BSD sur SUN, AIX sur IBM,...
Ces versions constructeurs dérivent toutes des deux versions présentes à l’époque et qui sont :
3 System V de AT&T pour des configurations moyennes et petites (lancé en 1983).
Unix System V
1983
MULTICS UNICS V1 V2 V3 V4 V5 V6 V7
1965 1969 1972 1973 1973 1974 1974 1976 1979
Unix BSD
1977
4 1 INTRODUCTION
Linux
Solaris (Sun Microsystems)
Le standard Unix
Deux organismes de normalisation (à l’origine groupements d’utilisateurs) s’attachent à définir
une norme internationale pour Unix :
3 le groupe X/Open
(IBM, Sun Microsystem, HP, ...)
Single Unix Specification.
multi-utilisateur
Il est possible de connecter sous Unix plusieurs utilisateurs simultanément. Chacun a à sa dispo-
sition l’ensemble des ressources du système. Comme tout système multi-utilisateur, Unix comporte
des mécanismes d’identification et de protection permettant d’éviter toute interférence (accidentelle
ou malveillante) entre utilisateurs.
Il y a deux types d’utilisateurs :
3 les utilisateurs ”normaux” : ont un compte avec
— un nom de connexion (login),
— un mot de passe (password),
— un espace de travail protégé sur le disque (un répertoire privé - home directory),
— une boı̂te aux lettres (mail box),
multi-tâche
Unix est multi-tâche car plusieurs programmes peuvent être en cours d’exécution en même temps
sur une même machine.
Un processus est une tâche en train de s’exécuter. On appelle processus, l’image de l’état du
processeur et de la mémoire au cours de l’exécution du programme.
En fait, à chaque instant, le processeur ne traite qu’au plus un seul des programmes lancés. La
gestion des processus est effectuée par le système.
Fonctions principales
Unix est un système d’exploitation dont voici les tâches principales :
3 Gestion de la mémoire :
Unix fait en sorte que la mémoire volatile (ou RAM) soit bien partagée entre tous les pro-
cessus.
Le schéma ci-dessous est une représentation des composants logiciels constituant le système Unix :
Shell
Editeurs de Gestion de
texte fichiers
Noyau
• gestion CPU
Programmes
Debugger
utilisateurs
Outils de communication
3 Le noyau est la couche logicielle la plus interne du système Unix. Elle est dédiée à la gestion
des composants matériels : processeur, mémoire, périphériques.
3 Le shell est l’interpréteur de commandes Unix qui vérifie, interprète les commandes, les
exécute et renvoie les réponses.
2 Connexion - Déconnexion
Pour permettre à de nombreux utilisateurs de travailler sur la même machine, Unix met en œuvre
des mécanismes d’identification des utilisateurs, de protection et de confidentialité de l’information.
L’utilisateur va devoir ouvrir une session (de travail) en s’identifiant auprès du système de la
façon suivante :
— entrer le nom de connexion après le message login,
— entrer le mot de passe après le message password.
Remarque : Le mot de passe ne s’affiche pas.
Après toute entrée en session (login), le système positionne l’utilisateur dans son répertoire privé
(home directory).
3 LES COMMANDES UNIX 7
Le changement de mot de passe s’effectue avec la commande passwd. Lors du changement il faut
fournir l’ancien mot de passe.
Il est conseillé de ne pas utiliser le clavier numérique.
Qualités d’un ”bon” mot de passe
— doit posséder entre 7 et 8 caractères
— doit posséder au moins une lettre majuscule
au moins un chiffre
et un caractère de ponctuation
— ne doit pas contenir de données relatives à votre identité
— ne doit pas appartenir à un dictionnaire
— ne doit pas contenir de répétition de caractères
En l’absence d’environnement graphique, une simple commande exit suffit pour terminer ma
session de travail.
L’une des caractéristiques d’Unix est qu’il fonctionne d’abord en mode ligne de commandes
et non en mode graphique. Cela permet des opérations plus complexes.
Une commande est un programme. Pour l’exécuter, il suffit de taper son nom éventuellement
suivi d’options et d’arguments.
La syntaxe est la suivante :
nom commande [-liste options][liste arguments]
Exemple :
ls -l * ←-
ls - lai * ←-
Lors de l’appui sur la touche Entrée, le shell analyse la ligne de commande et l’interprète.
Attention : Unix fait la différence entre majuscules et minuscules.
Une aide fournissant les informations sur les commandes est disponible en utilisant la syntaxe
suivante :
man nom commande ou
man -k mot clé si l’on ne connait pas la commande.
Exemple :
man ls ←-
man -k list ←-
8 3 LES COMMANDES UNIX
more Idem à la commande less. Utilisez la touche [Entrée] pour faire défiler
et tapez sur la touche q pour quitter
grep Recherche une chaı̂ne de caractères dans un ou plusieurs fichiers.
Exemple 1 : grep toto mon fichier (recherche la chaı̂ne toto dans
mon fichier). Exemple 2 : cat mon fichier — grep redhat (affiche
toutes les lignes contenant la chaı̂ne redhat dans mon fichier)
man Affiche les pages de manuel d’une commande ou d’une application.
Exemple : man rpm (affiche les pages de manuel du programme RPM)
find Recherche un ou plusieurs fichiers correspondants à des critères précis
(utilisez –help pour les connaı̂tre). Exemple : find /home/user -
name *.ogg (donne la liste de tous les fichiers .ogg dans le répertoire
/home/user)
whereis Recherche dans le PATH l’exécutable d’un programme. Exemple 1 :
whereis vim Exemple 2 : whereis xcdroast
pwd Connaı̂tre le chemin complet du répertoire courant (le répertoire dans
lequel vous êtes)
id Affiche les identifications (UID, GID, groupes)
id user Affiche les identifications d’un utilisateur
who -H Affiche des informations sur les utilisateurs connectés
date Affiche la date et l’heure
cal Affiche un calendrier du mois en cours. Exemple : cal 2006 (affiche le
calendrier de l’année 2006)
free Affiche des informations sur la mémoire
uptime Affiche l’heure, la durée d’activité du système, les utilisateurs...
top Affiche la liste des processus les plus gourmands (appuyez sur la
touche q pour quitter)
arch Affiche le type de microprocesseur
uname -m Idem à ci-dessus
uname -a Affiche des informations sur votre système et votre noyau
uname -sr Affiche la version de votre noyau
lspci Affiche la liste des périphériques disponibles sur PCI et AGP
ps Affiche la liste des processus en cours
ps -fe Affiche la liste des processus actifs classés par PID
ps -aux Affiche la liste des processus actifs de façon détaillée
pstree Affiche un arbre des processus
kill -9 Tue un processus selon son PID. Exemple : kill -9 375 (tue le processus
portant le PID 375)
killall -9 Tue un processus selon son nom. Exemple : killall -9 apache (tue le
processus apache)
du -hs Affiche la taille du répertoire courant ou d’un répertoire cible.
Exemple 1 : du -hs (affiche la taille du répertoire courant). Exemple
2 : du -hs /usr/local/src/mes tarballs (affiche la taille du répertoire
mes tarballs)
du -h — more Affiche page par page la taille du répertoire courant et de ses sous-
répertoires
df -h Affiche la taille en pourcentage de l’occupation des partitions des
disques durs
passwd Change le mot de passe de l’utilisateur en cours (Les mots de passe
trop simples à deviner sont rejetés)
passwd user Change le mot de passe d’un utilisateur (seul root a ce droit)
touch Crée un fichier vide. Exemple : touch fichier1 (crée un fichier vide
nommé fichier1)
file Affiche le type de fichier d’un ou plusieurs fichiers. Exemple 1 : file
mon fichier (affiche le type de fichier de mon fichier). Exemple 2 : file
* (affiche les types de fichiers des fichiers contenus dans le répertoire
courant)
mount La commande seule affiche la liste des périphériques montés. mount
/mnt/cdrom −− > monte le lecteur cdrom (si celui est configuré dans
le fichier /etc/fstab). umount /mnt/cdrom −− > démonte le lecteur
cdrom (si celui est configuré dans le fichier /etc/fstab)
tail Affiche les dernière lignes d’un fichier. Exemple 1 : tail mon fichier
(affiche les 10 dernières lignes de mon fichier). Exemple 2 : tail -n 18
mon fichier (affiche les 18 dernières lignes de mon fichier). Exemple
3 : tail -f /var/log/messages (affiche les messages du noyau en direct)
tar Création ou décompression d’archives (tarballs). Exemple 1 : tar -zxvf
fichier.tar.gz (décompresse l’archive fichier.tar.gz dans le répertoire
courant). Exemple 2 : tar -jxvf fichier.tar.bz2 (décompresse l’ar-
chive fichier.tar.bz2 dans le répertoire courant). Exemple 3 : tar -
f mon tarball.tar -cvf fichiers sources (crée l’archive mon tarball.tar
contenant les fichiers sources)
ifconfig Affiche la liste des adresses IP et des interfaces réseaux
ping Envoie une requête sur une adresse IP ou un nom de domaine afin de
calculer le temps de réponse
chmod Change les droits sur un fichier ou un répertoire. Exemple : chmod
777 mon fichier (donne tous les droits à mon fichier)
chmod -R Change les droits récursivement sur un répertoire. Exemple : chmod
-R 777 mon repertoire (donne tous les droits à toute l’arborescence
de mon repertoire)
chown Change le propriétaire d’un fichier ou d’un répertoire. Exemple :
chown root :root mon fichier (le fichier appartient à l’utilisateur root
et au groupe root)
chown -R Idem à ci-dessus mais de façon récursive (s’appliquant à toute l’arbo-
rescence d’un répertoire)
chgrp Change le groupe propriétaire d’un fichier ou d’un répertoire.
Exemple : chgrp root /tmp (le répertoire /tmp appartient mainte-
nant au groupe root)
chgrp -R Idem à ci-dessus mais de façon récursive (s’appliquant à toute l’arbo-
rescence d’un répertoire)
echo Affiche une chaı̂ne de caractère à l’écran. Exemple 1 : echo vive
GNU/Linux ! (affiche vive GNU/Linux ! à l’écran). Exemple 2 : echo
$USER (affiche le nom de l’utilisateur en cours). Exemple 3 : echo
$PATH (affiche le contenu de la variable PATH à l’écran)
adduser Assistant en mode console pour la création d’utilisateurs
useradd Création d’un utilisateur (utilisez –help pour en connaı̂tre les mul-
tiples options). Exemple : useradd -g linuxforever -p chihuahua -d
/home/gilles gilles (crée l’utilisateur gilles, mot de passe ”chihuhua”
appartenant au groupe linuxforever et son répertoire personnel)
userdel Suppression d’un utilisateur (utilisez –help en pour en connaı̂tre les
options). Exemple : userdel gilles (supprime l’utilisateur gilles du
système)
halt Eteind l’ordinateur
shutdown -h now Idem, eteind l’ordinateur
reboot Redémarre l’ordinateur
shutdown -r now Idem, redémarre l’ordinateur
startx Lance le serveur graphique sur une session utilisateur
4 Le système de fichiers
4.1.1 Définition
Sous Unix, un fichier est un objet recevant et délivrant des données, et qui est constitué d’une
chaı̂ne non structurée de caractères.
On remarquera donc que : les répertoires sont des fichiers. On peut afficher la liste des fichiers
d’un répertoire à l’aide de la commande ls. Si l’on veut aussi afficher le type de fichier (ex : ordinaire
ou répertoire) on utilisera l’option -l .
Exemple 1. Supposons que le répertoire exemple contient le répertoire bin et le fichier ordinaire
texte. Si l’on tape ls -l à partir du répertoire exemple, on obtient la réponse suivante :
Le d en tout début de la ligne concernant bin nous informe qu’un tel fichier est un répertoire
(directory en anglais) ; le - en tout début de la ligne concernant texte nous informe qu’un tel fichier
est un fichier ordinaire.
Un fichier est décrit dans une structure de données appelée i-nœud (ou inode) comportant les
informations suivantes :
— type de fichier (répertoire, fichier ordinaire,. . .),
— mode de protection,
— nombre de liens,
— numéro du propriétaire,
— numéro du groupe,
— taille du fichier en octets,
— adresses physiques directes,
— adresses physiques indirectes,
— date et heure du dernier accès,
de la dernière modification du fichier,
de la dernière modification de l’i-nœud.
Les i-nœuds sont rangés dans une table où chaque i-nœud a un numéro (index).
ls -i fich : permet de connaı̂tre le numéro de i-nœud du fichier ordinaire fich
ls -i rep : permet de connaı̂tre les numéros de i-nœuds des fichiers du répertoire rep
Le nom du fichier n’est pas une information stockée dans le i-nœud mais dans le répertoire auquel
appartient ce fichier. Ainsi, un répertoire est un fichier contenant une suite de couples (index de
i-nœud, nom). Un tel couple est appelé un lien.
Dans la Section 4.1 nous avons appris que tout type de fichier est contenu dans un répertoire
(répertoire parent). Pour indiquer une rélation d’inclusion entre fichiers on utilise la notation
suivante : si le répertoire rep contient le fichier toto on dessine une flèche allant de rep à toto.
Normalement, le répertoire rep est déssiné en haut, le fichier toto en bas.
Le système Unix observe strictement la règle suivante :
Afin d’éviter des chaı̂nes infinies d’inclusions, on a l’exigence d’avoir des répertoires racine, c’est-à-
dire qui ne sont contenus dans aucun répertoire. L’ensemble des fichiers gérés par le système Unix
est organisé en une seule arborescence de racine /. Voici un exemple classique d’arborescence de
fichiers Unix qui utilise la notation introduite avant :
De suite, nous donnons une description du contenu de ces répertoires dans un système Unix
classique. Bien sûr, ce contenu peut changer selon les goûts de l’administrateur du système.
4 LE SYSTÈME DE FICHIERS 13
bin
Attention : seul le répertoire / est un fichier sans nom, disposant d’une adresse fixe sur le disque,
connue par le système au démarrage.
Les utilisateurs peuvent enrichir l’arborescence en créant des nouveaux fichiers. La création de
nouveaux fichiers se fait à l’aide de commandes et sous conditions de permission. Dans cette partie
nous nous concentrons sur la création de fichiers. Plus loin dans ce document nous donnerons plus
de détails sur les permissions.
Après le login, l’utilisateur est, par défaut (voir Section 2.1), placé dans son répertoire personnel
(répertoire /home/util1 pour l’utilisateur nommé util1 dans l’arborescence précédente). Pour
accomplir ses tâches il pourra vouloir se déplacer dans d’autres répertoires et utiliser des
commandes. On appellera répertoire de travail le répertoire où se trouve l’utilisateur lorsqu’il
lance une commande.
Attention :
— le répertoire personnel est toujours le même (/home/util1 par exemple)
— le répertoire de travail change à chaque fois que l’utilisateur se déplace dans l’arborescence
La commande pwd. Si l’utilisateur veut connaı̂tre son répertoire de travail, il suffira qu’il tape
la commande pwd (print working directory), suivie par l’appui sur la touche Entrée.
La commande touch. Pour créer des nouveaux fichiers ordinaires, l’utilisateur dispose de
plusieurs méthodes. La plus commune consiste à utiliser la commande touch, suivie par le nom du
fichier qui va être créé. Cela va créer le fichier dans le répertoire de travail.
La commande mkdir. Pour créer un nouveau répertoire l’utilisateur doit utiliser la commande
mkdir, suivie par le nom du répertoire qui va être créé. Cela va créer le nouveau répertoire
dans le répertoire de travail.
Dès sa création un répertoire contient deux liens : le lien . qui se réfère au répertoire même et le
lien .. qui se réfère au répertoire parent. 1 Pour créer des fichiers ordinaires/répertoires en dehors
du répertoire de travail on donne en argument l’emplacement du nouveau fichier (chemin absolu ou
rélatif). Par exemple : mkdir ../test crée le répertoire test dans le répertoire parent du
répertoire de travail. Pour plus de détails on se réfère à l’exemple suivant.
Exemple 3. Considérons un utilisateur dans l’arborescence présentée précédemment,
immédiatement après la procédure de login. S’il utilise pwd, la réponse sera /home. Supposons qu’il
veuille se déplacer dans /tmp et y créer le répertoire rep. Il devra utiliser, dans l’ordre, les
commandes suivantes :
— cd ../tmp (référence rélative) ou cd /tmp (référence absolue)
— mkdir rep
Notons que, à ce point, la commande pwd donne /tmp, l’emplacement courant absolu de
l’utilisateur dans l’arborescence. Supposons que l’utilisateur veuille créer un fichier ordinaire toto
dans le répertoire rep. Une première méthode consiste à utiliser la commande touch sans se
déplacer dans l’arborescence :
— touch ./rep/toto
Une autre méthode consiste à se déplacer d’abord dans rep et ensuite créer le fichier toto.
— cd ./rep (ou également cd rep, ou encore cd /tmp/rep).
— touch toto
Quelle est, à votre avis, la réponse de la commande pwd après avoir utilisé la première méthode ?
Et après la deuxième méthode ?
Les actions les plus communes pour traiter les fichiers consistent à les copier, supprimer, déplacer
et renommer. Ces actions peuvent être accomplies par des commandes.
La commande cp. La commande pour copier les fichiers est cp. La syntaxe de base est la
suivante : cp toto tata crée une copie physique de toto, appellée tata ; il faut que toto existe
dans le répertoire de travail. Si l’on veut copier un fichier présent dans un répertoire autre que le
répertoire de travail, il suffit de spécifier le chemin (absolu ou rélatif) du fichier à copier : par
exemple, cp ../toto ./rep1/tata crée une copie du fichier toto (contenu dans le rép. parent du
rép. de travail) dans le répertoire rep1 (contenu dans le rép. de travail) ; cette copie est appellée
tata.
1. Le lien .. du répertoire / se réfère à / même.
4 LE SYSTÈME DE FICHIERS 15
La commande rm. Les mêmes idées fonctionnent pour la commande rm qui permet de
supprimer des fichiers. Par exemple rm toto supprime le fichier ordinaire toto du rép. de travail.
Pour supprimer un répertoire il faut utiliser l’option -r. Par exemple, rm -r test supprime le
répertoire test contenu dans le rép. de travail.
Attention : les commandes cp, rm, mv sont éxécutées sans demander de confirmation. Si l’on
veut que le système demande une confirmation explicite, l’utilisateur devra utiliser l’option -i.
On conclut par des précisions à propos des commandes présentées jusqu’à présent. Un
compendium des commandes à connaı̂tre est donné à la fin de la section.
— Le caractère ∼ est un raccourci pour le chemin absolu du répertoire personnel : l’issue de la
commande cd ∼ est de placer l’utilisateur dans son répertoire personnel.
— la commande cd sans arguments a le même effet que la commande cd ∼.
— la commande avec option ls -R liste récursivement les sous-répertoires du répertoire de
travail et leur contenu.
L’espace disque physique disponible peut être constitué d’un ou plusieurs disques, chacun d’eux
pouvant être divisé en une ou plusieurs “parties” (dites partitions logiques).
Un système de fichiers est une façon de stocker les informations concernant les fichiers
d’un partition logique et de les organiser.
Nous avons déjà vu que les informations des fichiers sont contenues dans leurs i-nœds et que les
fichiers sont organisés sous forme d’arborescence.
On a jusqu’à présent considéré que le système ne gérait qu’une seule partition et que les index des
i-nœuds étaient tous différents.
En fait, comme il peut exister différentes partitions logiques sur le même disque dur, il peut exister
plusieurs systèmes de fichiers sur le même disque dur.
Les différents systèmes de fichiers peuvent être “combinés”, c’est-à-dire la racine d’un de ces
systèmes peut être traitée comme un répertoire d’un autre système de fichiers. Dans ce cas on dit
que la partition logique du premier système est monté. L’arborescence globale de fichiers est en
fait constituée de plusieurs partitions montées. Le root file system 2 est le disque système
contenant la racine de l’arborescence, le noyau, les fichiers systèmes, . . .
Voici un exemple. Ici LP indique une partition logique. Dans la première image nous avons la
répartition de l’espace disque en partitions logiques et les file systems associés. Dans la deuxième
image, nous avons l’arborescence globale obtenue après montage des partitions.
disque 1 disque 2
partition
PP1 PP2 PP3 PP1 PP2
physique
partition
LP1 LP2 LP3 LP4
logique
Arborescence globale :
La commande mount. Pour monter des partitions il faut utiliser la commande mount avec les
bons arguments. Cela va au delà du programme de ce cours. Nous utiliserons la commande mount
2. “File system” est le mot anglais pour “système de fichier”. “Root” est le mot anglais pour “racine”
5 PROTECTION DES FICHIERS 17
uniquement pour afficher les partitions logiques montées. Pour afficher les unités montées
(c’est-à-dire les partitions logiques montées) on utilise la commande mount, sans arguments ni
options.
Chaque fichier (ordinaire ou répertoire) possède un ensemble d’attributs définissant les droits
d’accès à ce fichier pour tous les utilisateurs du système.
Un utilisateur est une personne ayant un compte sur le système et le droit d’y effectuer des
actions (par exemple, lecture ou création d’un fichier). Toutefois, l’utilisateur a des pouvoirs limités
sur le système. Par exemple il ne peut pas détruire des fichiers de système. Cela empêche qu’il
puisse rendre le système inutilisable. La gestion complète du système est de compétence de
l’administrateur du système. Dans cette partie nous nous occupons des utilisateurs, sans traiter les
administrateurs de système.
Les utilisateurs peuvent être regroupés en groupes. Un utilisateur peut appartenir à plusieurs
groupes et il peut y avoir plusieurs groupes distincts.
Les droits d’accès aux fichiers déterminent qui peut faire quoi d’un fichier. Le quoi consiste en trois
types d’actions, chacune associée à un caractère :
3 lecture (r pour read)
pour un répertoire, signifie ”lister les fichiers présents dans le répertoire”
pour un fichier ordinaire, signifie ”l’ouvrir en lecture”
Cela permet de représenter les droits d’accès à un fichier par une chaı̂ne de trois caractères : le
premier caractère se réfère au droit de lecture, le deuxième au droit d’écriture, le troisième au droit
d’exécution. Si le droit est présent nous utiliserons dans la chaı̂ne la lettre correspondante
(c’est-à-dire r, w ou x), sinon nous utiliserons un -.
Attention : il est crucial que l’ordre soit respecté ! D’abord le droit de lecture, après le droit
d’écriture, enfin le droit d’exécution.
Comme les systèmes Unix sont des systèmes multi-utilisateurs, il est possible qu’un fichier soit créé
par un utilisateur, mais d’autres utilisateurs veuillent le lire/modifier ou supprimer. En
conséquence, pour chaque fichier, il existe trois types d’utilisateurs, chacun associé à un caractère :
3 le propriétaire du fichier (u pour user – il s’agit par défaut 3 de l’utilisateur
qui a créé le fichier)
3 les membres du groupe auquel appartient le propriétaire du fichier (g pour group – il s’agit
des utilisateurs du groupe du propriétaire du fichier)
On conclut par une précision à propos des types de fichiers. Il existe différents types de fichiers,
chacun associé à un caractère :
— fichier ordinaire (-)
— fichier répertoire (d)
— fichier spécial : périphérique accédé en mode caractère (c)
— fichier spécial : périphérique accédé en mode bloc (b)
— tube nommé (p)
— lien symbolique (l)
— socket (s)
L’information sur le type de fichier est importante pour déterminer les droits d’accès : par exemple,
nous avons vu que l’“exécution” d’un répertoire veut dire que l’on a le droit de parcourir le
répertoire.
3. Voir la section 5.4 pour les commandes qui permettent de changer les valeurs par défaut.
5 PROTECTION DES FICHIERS 19
Pour visualiser les droits d’accès d’un fichier, on utilise la commande ls -l suivie par le nom du
fichier.
Le premier caractère spécifie le type du fichier (voir aussi l’exemple 1).
Les neufs suivants identifient les droits d’accès, comme dans l’exemple 5 :
— présence du droit si une lettre r, w ou x
— abscence du droit si -
D’autres informations sont aussi affichées, voir l’exemple 6 suivant :
Exemple 6. La ligne de commande ls -l /etc/passwd donne
On peut également représenter les droits d’accès à un fichier par trois chiffres (un nombre octal).
Nous savons que la chaı̂ne de neuf caractères représentant les droits est en réalité divisée en trois
champs : les premiers trois caractères concernent le propriétaire du fichier, les trois suivants
concernent le groupe du propriétaire, les derniers trois les autres. Chaque champs contient trois
caractères.
Nous interprétons ces trois caractères comme un nombre entier écrit en notation binaire : si le
caractère est r, w ou x (présence de droit) il est remplacé par 1, si le caractère est - il est remplacé
par 0.
Ainsi, la chaı̂ne r-x est équivalente à 101, c’est-à-dire 5 (en notation binaire) et la chaı̂ne r-- est
équivalente à 100, c’est-à-dire 4 (en notation binaire).
En conséquence, la chaı̂ne complète de neuf caractères représentant les droits de tous les types
d’utilisateur est équivalente à un séquence de trois nombres entiers.
Exemple 7. La chaı̂ne rwxrw-r-x est équivalente à 765.
On a alors rwxrw-r-x = 111 110 101 = 765 car
111 = 22 + 21 + 20 = 4 + 2 + 1 = 7
110 = 22 + 21 = 4 + 2 = 6
101 = 22 + 20 = 4 + 1 = 5
Cela revient à considérer que r = 4, w = 2 et x = 1 et à faire la somme pour chaque type
d’utilisateurs.
20 5 PROTECTION DES FICHIERS
Nous savons que l’ensemble d’utilisateurs qui ont accès à un fichier (“propriétaire”, “groupe” et
“autres”) est determiné par défaut lors de la création du fichier même. Toutefois, il existe des
commandes pour changer cet ensemble d’utilisateurs.
Attention : il faut préciser que certains systèmes Unix ne permettent l’utilisation des commandes
suivantes qu’à l’administrateur de système.
La commande chgrp : changer le groupe. Nous pouvons changer le groupe d’un fichier,
grâce à la commande chgrp.
La syntaxe d’utilisation est :
La commande chmod : changer les droits d’accès. Nous pouvons changer les droits d’accès
d’un fichier avec la commande chmod. Pour comprendre la syntaxe de cette commande il faut
rappeler les deux notations introduites dans les sections 5.1 et 5.3 : la notation symbolique
(informellement “rwxrwxrwx”) et la notation absolue (informellement “765”).
La syntaxe générale est la suivante :
Le mode affecte les droits du propriétaire, du groupe et des autres. On a deux façons de spécifier le
champ mode :
3 mode absolu :
mode est le nombre octal qui correspond aux nouveaux droits du fichier.
Par exemple : chmod 765 fich
3 mode symbolique :
mode indique de quelle façon les droits d’accès doivent être modifiés. Il se décompose en
[qui] op accès où
— qui est optionnel et indique quelles classes sont concernées par la commande chmod ; ce
champ est composé de une ou plusieurs lettres parmi u, g et o (correspondants à
utilisateur, groupe et autres).
Si aucune lettre n’est spécifiée alors tous les types d’utilisateurs sont concernés (ou a
pour all).
— op peut être :
+ pour ajouter des droits d’accès
- pour enlever des droits d’accès
= pour affecter des droits d’accès.
5 PROTECTION DES FICHIERS 21
— accès est une combinaison des lettres r, w et x qui spécifient les types d’accès.
Dans le cas du mode symbolique on peut aussi enchaı̂ner plusieurs modes, séparés par des
virgules.
Par exemple : chmod a=r,u+w fich est une syntaxe valide. Son effet est celui de changer
d’abord les droits de tous (utilisateur, groupe et autres) en “seule lecture” (a=r) et ensuite
d’ajouter au propriétaire le droit d’écriture (u+w).
Exemple 8. La commande chmod 765 fich change les droits du fichier fich en 765, c’est-à-dire
en rwxrw-r-x. Donc, la commande chmod a=rwx,g-x,o-w fich a le même effet : d’abord elle
donne tous les droits à tous les types d’utilisateurs, après elle enlève le droit d’exécution aux
membres du groupe et le droit d’écriture aux autres. En conséquence, nous avons les équivalences
suivantes :
chmod 765 fich ⇐⇒ chmod a=rwx,g-x,o-w fich ⇐⇒ chmod u=rwx,g=rw,o=rx fich
La commande umask : changement des droits par défaut. Au moment où l’utilisateur crée
un fichier, des droits d’accès par défaut sont donnés à ce fichier. La commande umask permet de
consulter et changer ces droits d’accès.
Pour comprendre le fonctionnement de la commande umask il faut introduire la notion de mode
par défaut : ceci est une séquence complète de droits exprimée en notation symbolique.
Pour une commande de création de fichier ordinaire, le mode par défaut est toujours rw-rw-rw-.
Le mode par défaut pour la création d’un répertoire est toujours rwxrwxrwx.
Attention : Ne jamais confondre le mode par défaut avec le mode utilisé à propos de la commande
chmod. En particulier, le mode par défaut est toujours le même.
Une autre notion indispensable est la notion de masque. Le masque est une séquence de droits,
dont la valeur peut changer.
Pour connaı̂tre le masque courant on utilise la commande umask sans arguments (voir exemple 9).
Le masque est changé par la commande umask suivie par la nouvelle séquence de droit en notation
octale.
Pour obtenir les droits d’accès il faut d’abord traduire le mode par défaut et le masque dans leur
representation binaire. Ensuite, les droits d’accès sont obtenus après l’opération logique suivante :
(mode par défaut) & (¬masque) où & est le ET logique et ¬ est le NON logique.
Exemple 9. Un utilisateur tape la commande umask sans argument et la réponse du système est
022. Ceci est le masque courant. Son codage binaire est 000 010 010.
Comme le mode par défaut pour les fichiers ordinaires est rw-rw-rw- (codage binaire 110 110 110)
les droits à la création d’un fichier ordinaire seront rw-r--r--. En effet,
Si l’utilisateur veut changer le masque pour que ce dernier corresponde à 000 111 111 (codage
octale 077) il pourra taper la commande umask 077. Dans ce cas, les droits d’accès à un fichier à
sa création seront rw-------. Quels sont le droits pour un répertoire avec le même umask ?
22 6 RECHERCHE DE FICHIERS ET DE TEXTE
Nous présentons deux commandes très importantes dans la recherche de fichiers et texte : la
commande find (pour la recherche de fichiers, voir Section 6.2) et la commande grep (pour la
recherche de texte dans un fichier, voir Section 6.3). Avant de commencer il faut introduire les
notions de métacaractères et d’expressions régulières.
cp ../*.ods .
copie tous les fichiers se terminant par la chaı̂ne “.ods” du répertoire parent dans le répertoire de
travail.
Expressions régulières. Les expressions régulières (comme les métacaractères) sont aussi
des suites de caractères permettant de faire des sélections.
Une expression régulière peut être aussi simple qu’un mot exact à rechercher, par exemple
‘Bonjour’, ou aussi complexe que ‘^ [a-zA-Z]’ qui correspond à toutes les lignes commençant
par une lettre minuscule ou majuscule.
6 RECHERCHE DE FICHIERS ET DE TEXTE 23
Exemple 11. L’expression regulière ^ [0-9][0-9]*$ correspond à la ligne ne contenant que des
chiffres et non vide.
Pour chercher un fichier nous utilisons dans ce cours la commande find. Cette commande effectue
une recherche récursive (c’est-à-dire dans toute l’arborescence à partir d’un répertoire spécifié).
Plusieurs informations sont demandées pour que la recherche soit précise :
Le champ <action> indique ce que la commande find va faire sur les fichiers trouvés. Une valeur
très importante pour ce champ est -print qui permet d’afficher sur la sortie standard les fichiers
trouvés.
Exemple 12. La ligne de commande find / -name "toto" -print cherche, à partir du rép.
racine /, les fichiers dont le nom est toto et affiche la liste.
La ligne find /usr -name "*.c" -print cherche, à partir de /usr, les fichiers qui se terminent
par “.c” (par ex. toto.c, tata.c, etc.) et affiche la liste. Ici * est un métacaractère.
Ligne find . ! -user olivier -print : tous les fichiers n’appartenant pas à Olivier dans le rep.
de travail.
Qu’est-ce que la ligne find . \( -name "a.out" -o -name "*.c" \) -print fait, à votre avis ?
Exemple 13. grep -vn ’bla’ fich.txt affiche les lignes du fichier fich.txt qui ne
contiennent pas la chaı̂ne “bla” et les numérote.
Le programme sed est un éditeur en ligne de commande non interactif : il lit les lignes d’un fichier
une à une (ou provenant de l’entrée standard), leur applique un certain nombre de commandes
d’édition et renvoie les lignes résultantes sur la sortie standard.
Attention : sed ne modifie pas le fichier traité, il écrit tout sur la sortie standard.
La syntaxe générale de la commande est la suivante :
sed [-n] [-e commande][-f fichier de commandes] [fichier]
avec :
-n : écrit seulement les lignes spécifiées (en utilisant p dans le champ commande) sur la sortie
standard.
-e : permet de spécifier les commandes à appliquer sur le fichier. Afin d’éviter que le shell
interprête certains caractères, il faut encadrer la commande avec des ´ (quotes) ou des "
(guillemets).
-f : les commandes sont lues à partir d’un fichier.
Récursivement pour chaque ligne, on applique commande (si cela est possible) puis on affiche sur la
sortie standard la ligne modifiée ou non.
La syntaxe générale des commandes est de la forme
caractérisation des adresses commandes
avec caractérisation des adresses de la forme
: toutes les lignes
num : la ligne num
num1,num2 : les lignes entre les lignes num1 et num2
/RE/ : les lignes correspondant à l’expression régulière RE
/RE1/,/RE2/ : les lignes entre la première ligne correspondant à l’expression régulière RE1 et la
première ligne correspondant à l’expression régulière RE2.
Exemple 14. La commande sed -n 1,4p toto.txt n’écrit que les lignes spécifiées (option -n)
du fichier toto.txt, c’est-à-dire les premières 4 lignes (commande 1,4p).
Quand on utilise la commande s on peut utiliser les sous-chaı̂nes exprimées dans RE, dans
l’expression remplacement. L’expression \1 se réfère à la première sous-chaı̂ne, \2 à la deuxième,
etc.
Exemple 16. La commande
sed -e ’s/\([0-9][0-9]*\)/aa\1aa/’ fichier
La sous-expression \([0-9][0-9]*\) est représentée par \1 et entourée des caractères aa.
La chaı̂ne to2to devient toaa2aato.
La ligne de commande
sed -e ’/toto/!d’ fichier
supprime les lignes ne contenant pas la chaı̂ne toto.
Attention : les lignes ne sont pas vraiment supprimées, mais pas affichées.
D’autres commandes. Utiliser la commande man sed pour se renseigner sur les commandes a,
i, p, l, =, q, r, w.
8 Les processus
8.1 Définition
8.2.1 Création
Toute exécution d’un programme déclenche la création d’un processus dont la durée de vie est
égale à la durée d’exécution du programme.
Le système alloue à chaque processus un numéro d’identification unique : PID (Process IDentifier).
Tout processus est créé par un autre processus : son processus père.
→ Endormi (S pour <20s ou I pour >20s) : le processus est en attente de l’arrivée d’un évènement
(par exemple, une réponse du terminal).
28 8 LES PROCESSUS
→ Zombi (Z) : le processus a pris fin sans libérer ses ressources (peut être bloqué jusqu’à l’arrêt de
la machine).
→ Suspendu (T) : le processus a été interrompu et attend l’arrivée d’un signal de reprise.
Chaque processus présent dans le système occupe différentes régions en mémoire centrale. Quand
un processus a besoin pour son exécution d’une taille de mémoire supérieure à celle disponible, le
système tente de libérer de la place mémoire en copiant en zone de débordement (swap) les zones
occupées par certains processus en attente. La zone de swap est une position du disque dur.
3 mode différé : at permet de déclencher l’exécution d’une commande à une date fixée.
ex : at 16:50 10/06/08 < commande
démarre le lancement du contenu de commande le 06 octobre 2008 à 16h50.
(at -l pour lister et at -r pour supprimer)
3 mode batch : permet de placer une commande dans une file d’attente.
La commande ps. La commande ps donne la liste des processus en cours. Par défaut, elle
affiche tous les processus actifs de l’utilisateur qui a lancé la commande ps et qui appartiennent au
même terminal depuis lequel ps a été invoquée.
On décrit les lignes de commandes les plus utiles dans ce contexte :
ps -u utilisateur : affiche les processus lancés par utilisateur
ps -e : affiche tous les processus dans le système
ps -f : génère pour chaque processus :
UID : nom utilisateur
PID : numéro du processus
PPID : numéro du processus père
STIME : l’heure de lancement du processus
TTY : le nom du terminal
TIME : temps cumulé d’exécution du processus
CMD : commande exécutée
La commande kill et les signaux Au cours de l’exécution d’un processus, il est possible
d’agir sur son déroulement en lui envoyant un signal. Unix définit de façon standard un certain
nombre de signaux dont :
8 LES PROCESSUS 29
3 un autre processus,
3 l’utilisateur :
— soit l’utilisateur tape des caractères provoquant l’envoi d’un signal au processus en cours
d’exécution sur le terminal (ex : <ctrl-z> pour SIGTSTP, <ctrl-c> pour SIGINT),
— soit l’utilisateur utilise la commande kill pour envoyer un signal à un ou plusieurs
processus lorsqu’il n’a pas accès au terminal de rattachement des processus ou lorsque
ces derniers sont exécutés en arrière plan.
avec :
signal : nom symbolique ou numéro
PID : donné par ps
Dans le manuel de la commande kill d’autres signaux sont décrits. Taper man kill pour les
regarder. La ligne de commande kill -l permet d’obtenir la liste de tous les signaux disponibles.
Un job est une ligne de commande shell. Chaque job est numéroté de 1 à N par le shell. Un job
peut se trouver dans trois états :
→ avant plan : Le job s’exécute et vous n’avez pas la main sur le shell.
Interruption
Ctrl-c
Tâche en Tâche en
premier plan fg tache arrière plan
Tâche en
Ctrl-z stoppée
Tout processus communique avec l’extérieur par le biais de trois fichiers logiques appelés fichiers
standard d’entrées/sorties :
— Le fichier entrée standard (stdin de numéro 0) sur lequel le processus lit ses données,
— Le fichier sortie standard (stdout de numéro 1) sur lequel le processus écrit ses données,
— Le fichier sortie erreur standard (stderr de numéro 2) sur lequel le processus écrit ses
messages d’erreur.
Quand un processus naı̂t, ces trois fichiers sont ouverts. Par défaut, ils sont associés au terminal de
lancement : le clavier pour le fichier d’entrée standard, l’écran pour la sortie standard et pour la
sortie erreur standard.
Il est possible de rediriger les E/S standards d’un processus c’est-à-dire de leur associer un fichier
autre que le terminal. Pour cela, on utilise la syntaxe suivante :
commande < fich : redirige l’entrée standard de commande sur le fichier fich (qui doit exister
et être lisible par l’utilisateur). Ceci signifie que commande lit ses données
en entrée dans le fichier fich.
commande n> fich : redirige la sortie n de commande sur le fichier fich (avec écrasement de
celui-ci s’il existe et création s’il n’existe pas). Valeur de n par défaut : 1
commande n>> fich : redirige la sortie n de commande sur le fichier fich (sans écrasement mais
en ajoutant).Valeur de n par défaut : 1
commande > fich 2>&1 : redirige la sortie standard et la sortie erreur standard de commande sur le
fichier fich.
Il est possible sur une même ligne de commande de lancer plusieurs processus. Selon la syntaxe
utilisée, les résultats obtenus seront différents.
9.1 Définition
L’interpréteur de commandes, le shell, a pour rôle de traduire les commandes saisies par
l’utilisateur afin que le système puisse les exécuter. Un shell permet également d’exécuter des
fichiers, appelés scripts, contenant une suite de commandes plus ou moins complexes. Il offre aussi
la possibilité à l’utilisateur de configurer son environnement de travail.
Il existe un certain nombre de shells que l’on peut séparer en deux familles :
3 La famille des Bourne shell :
• sh : le plus ancien développé chez AT&T par Steven Bourne fin 1970,
• ksh : le korn shell développé chez AT&T par David Korn en 1980, compatible avec sh et
disposant de plus de fonctionnalités,
• bash : le bourne again shell développé par la Free Software Foundation en 1989,
Trois étapes :
3. Exécution.
3. Variables : Définir (ou activer) des variables pour paramétrer l’environnement ou pour
écrire des scripts.
Un identificateur de variable est une chaı̂ne de caractères alphanumériques (commençant
par une lettre). Il existe deux types de variables :
— les variables d’environnement prédéfinies permettant de réaliser des contrôles
particuliers,
— les variables définies par l’utilisateur.
Pour obtenir la valeur d’une variable, on utilise le caractère spécial $ : $var ou ${var}.
4. Expansion de fichiers :
Utiliser les métacaractères pour spécifier des listes de fichiers (*, ?, [. . .], [!. . .]).
Il existe un ensemble de caractères interprétés par le shell d’une manière particulière. Pour qu’un
caractère spécial soit traité comme un caractère quelconque il faut le faire précéder du caractère \.
9 LES INTERPRÉTEURS DE COMMANDES 33
9.3 Bash
Dans ce cours on utilise le Bourne again shell, aussi appellé Bash. Voici les commandes pour
lancer/terminer un Bourne again shell :
Lancement : bash
Terminaison : <ctrl-d> ou logout ou exit
La commande history : historique de Bash. À chaque fois que l’utilisateur soumet une
commande, la commande est enregistrée par le shell. Il est possible de rappeler une commande
précédente (ou une partie de celle-ci) telle quelle ou après lui avoir fait subir quelques
modifications. Les deux syntaxes à connaı̂tre sont les suivantes :
history : affiche la liste des commandes mémorisées.
! : déclenche le mécanisme de substitution lié à l’historique, sauf lorsqu’il est suivi d’un caractère
d’espacement (espace, tabulation ou newline) ou des signes = ou (.
Une référence à l’historique peut être composée d’une à trois parties dans l’ordre suivant :
1. une référence à une ligne de commande (Event Designator),
2. une référence à un mot dans une ligne de commande (Word Designator),
3. un ou plusieurs modifieur(s) de mot(s) référencés.
34 9 LES INTERPRÉTEURS DE COMMANDES
Event Designator :
Designateur Substitué par
!! La commande précédente
!n La ligne de commande de numéro n
!-n La ligne de commande de numéro : numéro de la commande courante - n
!str La ligne de commande la plus récente commençant par la chaı̂ne str
!?str La ligne de commande la plus récente contenant la chaı̂ne str
Word Designator :
Designateur Substitué par
:0 Le premier mot = nom de la commande
:n Le n-ième mot (à partir de 0)
^ Le deuxième mot (⇔:1⇔ le premier argument)
$ Le dernier mot
:n-m Tous les mots allant du nième au mième
* Tous les arguments (⇔ mots du 2ème au dernier)
:n* Tous les mots à partir du nième
Exemple 20. Supposons que l’utilisateur lance un shell Bash et que, ensuite, la commande
cd ./Bureau
soit entrée dans ce shell. Alors la ligne de commande
!!:1:t:p
affiche le mot Bureau dans le shell.
En effet, !! récupère la dernière commande entrée (c’est-à-dire cd ./Bureau), le modifieur :1
récupère son premier argument (c’est-à-dire ./Bureau), le modifieur :t récupère le nom du
fichier (sans son chemin, donc Bureau) et, enfin, :p imprime le résultat sans l’exécuter.
9 LES INTERPRÉTEURS DE COMMANDES 35
Les paramètres du Bash peuvent être imaginés comme des espaces en mémoire où l’utilisateur
peut stocker des données ou à partir desquels il peut récuperer des données. Chaque paramètre a
son nom (appelé en anglais identifier ).
Les variables sont des paramètres que l’utilisateur peut créer, modifier et détruire, selon ses
besoins.
Attention : Dans l’exemple précédent on a utilisé des " autour de l’expansion. Cela n’est pas
obligatoire, mais fortement recommandé. L’exemple suivant explique pourquoi.
Alors la variable monfichier contient la chaı̂ne “Peu important.txt” comme valeur. Donc, si
l’utilisateur tape
rm $monfichier
Bash remplace la variable par sa valeur et l’effet est le même que la ligne :
rm Peu important.txt
Cela signifie que Bash tente d’appliquer rm aux fichier Peu (qui n’existe pas) et important.txt qui
est supprimé ! ! On a donc supprimé le fichier important.txt, tandis que le fichier Peu
important.txt (qu’on voulait supprimer) existe encore.
Un script est une séquence de commandes contenues dans un fichier de texte. Par défaut, le Bash
lit les commandes du script dans l’ordre d’apparition et procède à la commande suivante si la
commande courante termine. Toutes les commandes vues dans ce cours peuvent être utilisées dans
les scripts.
Exécution de scripts. Supposons d’avoir créé un fichier contenant les commandes à exécuter et
que ce fichier s’appelle script1. On peut exécuter script1 par la ligne de commande :
bash script1
De manière plus détaillée, la ligne de commande lance un nouveau processus bash, lui fait lire le
fichier script1 et exécuter les commandes contenues dans ce script.
Nous avons à disposition une autre façon d’exécuter le script : on peut demander au noyau du
système d’exploitation de lancer bash et de lui donner script1 comme argument.
Pour utiliser cette méthode, il faut que deux conditions soient satisfaites :
— La première ligne du script commence par #!/bin/bash (ce qui permet au noyau de lancer
bash)
— le fichier script1 soit exécutable (utiliser chmod pour le rendre exécutable)
Si ces deux conditions sont satisfaites, alors on peut simplement taper ./script1 dans un terminal.
Remarquez que si l’on utilise la première méthode, la ligne #!/bin/bash est interprétée comme un
commentaire, et donc ignorée. Il est donc fortement recommandé de commencer toujours un script
par cette ligne 4 , car elle permet d’utiliser les deux méthodes.
Les paramètres d’un script. Nous savons déjà lancer un script bash. Nous pouvons aussi
passer des arguments au script. Comme pour les commandes, les arguments d’un script ne sont que
des mots qui suivent le nom du script dans la ligne de commande. Par exemple, si script1 est un
script bash dans notre répertoire de travail, la commande
./script1 arg 1 arg 2 . . . arg m
passe les m arguments arg 1, . . . , arg m à script1.
Les commandes à l’intérieur du script peuvent utiliser ces arguments. Elles peuvent aussi utiliser
les informations sur le script même, ou sur le shell en exécution (par exemple son PID). Cela se fait
grâce à certains paramètres spéciaux. Les paramètres spéciaux sont des paramètres qui ne sont
pas des variables.
Comme pour les variables, on peut utiliser le mécanisme d’expansion pour utiliser la valeur des
paramètres spéciaux.
4. En général, la ligne à utiliser doit contenir le chemin absolu du programme bash et donc dépend en réalité de la
configuration du système.
9 LES INTERPRÉTEURS DE COMMANDES 37
— Le paramètre contenant le nom du script est 0. Utilisation : "$0" (remarquez les guillemets).
— Le paramètre contenant le k-ième argument est k. Utilisation : "$1" (premier argument),
"$2" (deuxième argument), etc. Ces paramètres sont appellés paramètres de position.
— Le paramètre @ contient tous les mots des paramètres de position. L’expansion "$@" permet
d’obtenir la liste de ces mots.
— Le paramètre # contient le nombre d’arguments. Utilisation : $#
— Le paramètre $ contient le PID du shell courant. Utilisation : $$
— Le paramètre contient le dernier argument de la dernière commande exécutée. Utilisation :
"$ "
Exemple 23. On considère le script suivant (appellé example) :
#!/bin/bash
echo Script "$0"
echo $# Arguments:
echo "$@"
echo Troisième argument:
echo "$3"
Si l’on tape bash exemple arg1 arg2 "mon nom" la sortie sera :
Script exemple
3 Arguments:
arg1 arg2 mon nom
Troisième argument:
mon nom
Comment la sortie est-elle modifiée si l’on tape : bash exemple arg1 arg2 mon nom ?
Les opérateurs de contrôle. Nous présentons les opérateurs && et ||. Nous verrons que ces
deux opérateurs correspondent respectivement au ET logique et OU logique.
D’abord il faut introduire la notion de code de sortie. À chaque fois que l’utilisateur lance une
commande, la commande même envoie un signal pour informer sur le résultat. Ce signal est appelé
code de sortie.
Les codes de sorties sont en réalité des valeurs entières de 0 à 255 (incluses). Si la commande a été
exécutée avec succès, le code de sortie vaut toujours 0.
En cas d’erreur par contre, il correspond à une valeur strictement positive. Selon la valeur,
l’utilisateur peut essayer de comprendre où l’erreur s’est verifiée.
Pour récupérer le code de sortie de la dernière commande, nous pouvons utiliser le paramètre
spécial ? . L’utilisation est comme d’habitude $?.
Exemple 24. La commande true ne fait rien, toujours avec succès. Donc si l’utilisateur tape
true et après echo $? la réponse sera 0.
if COMMANDES_1
then
SUITE-DE-COMMANDES_1
elif COMMANDES_2
then
SUITE-DE-COMMANDES_2
...
elif COMMANDES_(m-1)
then
SUITE-DE-COMMANDES_(m-1)
else
SUITE-DE-COMMANDES_m
fi
if [[ EXPRESSION ]]
then
COMMANDES
fi
On peut regrouper les EXPRESSIONs par des parenthèses pour changer l’ordre d’évaluation.
D’autres valeurs pour EXPRESSION se trouvent dans man test.
Nous introduisons la structure case-esac. La syntaxe générale est la suivante :
case EXPR in
EXPR1) COMMANDES1 ;;
EXPR2) COMMANDES2 ;;
...
*) COMMANDES ;;
esac
Dans ce contexte, EXPR, EXPR1, etc peuvent contenir des paramètres, des métacaractères, etc. Ils
peuvent aussi être des listes d’expressions, séparées par |.
case $LANG in
en*) echo ’Hello!’ ;;
fr*) echo ’Salut!’ ;;
de*) echo ’Guten Tag!’ ;;
nl*) echo ’Hallo!’ ;;
it*) echo ’Ciao!’ ;;
es*) echo ’Hola!’ ;;
C|POSIX) echo ’hello world’ ;;
*) echo ’Je ne parle pas ta langue.’ ;;
esac
Les structures répétitives. Nous introduisons les structures les plus communes pour exécuter
des boucles (répétitions de tâches).
La structure while-do exécute des commandes jusqu’à ce qu’une condition soit satisfaite. La
syntaxe générale est la suivante :
while COMMANDE
do
COMMANDES
done
Les commandes COMMANDES sont exécutées tant que la commande COMMANDE sort avec succès
(code=0).
40 9 LES INTERPRÉTEURS DE COMMANDES
La structure for-do repète des tâches un nombre préalablement choisi de fois. La syntaxe générale
est la suivante :
Dans cette écriture, MOTS est une liste de mots. Pour les listes de mots nous pouvons utiliser des
expressions simples, comme 1 2 3 4 5, ou des expressions plus compliquées, comme {1..5} (qui
est équivalente à la précédente) ou des expressions contenant des métacaractères.
En effet cette structure fait d’abord l’expansion des mots contenus dans la liste MOTS et après pour
chacun de ces mots :
1. affecte la valeur de la variable VARIABLE au mot courant (en suivant l’ordre de la liste)
2. exécute COMMANDES
for i in *.mp3
do
rm "$i"
done
supprime tous les fichier se terminant par “.mp3” dans le répertoire de travail (où l’on lance le
script par exemple).
Arithmétique en Bash L’arithmétique en bash n’est que sur les nombres entiers. Il faut utiliser
une syntaxe spécifique pour effectuer des opérations arithmétiques en bash. En effet, les chiffres
sont traités par bash comme des caractères et, par conséquent, les nombres sont traités comme des
mots. Par exemple la ligne de commande suivante :
echo 3+2
affiche 3+2 (et non 5).
Cela signifie que l’expression 3+2 est traitée comme une chaı̂ne de caractères.
Pour forcer bash à traiter les nombres dans un contexte arithmétique, on utilise la syntaxe
(( EXPRESSIONS ))
Cette syntaxe évalue les expressions EXPRESSIONS de façon arithmétique. Si le résultat de cette
évaluation n’est pas 0 le code de sortie sera 0. Sinon, le code de sortie sera 1.
Attention : l’évaluation n’affiche pas le résultat. Pour effectuer une expansion de l’évaluation on
utilise $(( EXPRESSIONS )) .
Dans l’exemple précédent nous avons implicitement utilisé l’opérateur de somme, + . Les autres
opérateurs utilisables dans le contexte arithmétique sont les mêmes que ceux du langage C (la
précédence entre opérateurs est aussi héritée du C).
Voici une liste assez complète :
9 LES INTERPRÉTEURS DE COMMANDES 41
Script interactif : la commande read. Nous savons qu’un script peut communiquer avec
l’utilisateur, par exemple grâce à la commande echo. L’utilisateur aussi peut fournir des
informations à un script en cours d’exécution. À ce propos, nous introduisons la commande read.
Dans ce cours on utilise la commande read avec la syntaxe suivante :
La ligne de commande précédente lit une ligne de l’entrée standard (ou une autre entrée si l’on
utilise les redirections), la sépare en mots et affecte le premier mot à la variable var1, le deuxième
mot à var2, etc.
Une option très utilisée de la commande read est -p, qui affiche un message avant de commencer
la lecture de la ligne. Ce message est fourni en argument à l’option. La syntaxe sera dans ce cas :
Dans l’exemple 30, le script demande deux entiers à un utilisateur et en affiche la somme.
Exemple 30.
#!/bin/bash