Vous êtes sur la page 1sur 41

Systèmes d’exploitation LINUX

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).

3 Le système BSD (Berkeley Software Distribution) de l’Université de Berkeley pour


des configurations importantes dans le domaine scientifique (lancé en 1977).

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

Il existe de nombreuses versions dérivées :

AIX (IBM) (1ere version 86)


HP-UX (HP)
Unix System V IRIX (SGI)
UnixWare (SesGroup)
XENIX (Microsoft)

Linux
Solaris (Sun Microsystems)

FreeBSD (libre) Licence BSD


Unix BSD NetBSD
OpenBSD
MacOSX (Apple)

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.

3 le groupe POSIX (IEEE 1003) depuis 1988


Portable Operating System Interface

Les logiciels sous Unix


Sous le système Unix, il existe un grand nombre de logiciels du domaine public (logiciels de la
Free Software Foundation - organisation pour la gratuité des logiciels sous Unix (depuis 1985)) :
— compilateurs C, C++,
— make (moteur de production),
— awk (logiciels de traitement de lignes, manipulation de fichiers textuels),
— emacs,
— Gzip,...
— Linux (conforme aux standard POSIX).

1.2 Fonctionnalités et spécificités d’Unix

Définition d’un système d’exploitation


Le système d’exploitation (SE) est un ensemble de programmes responsables de la liaison
entre les ressources matérielles d’un ordinateur et les applications informatiques de l’utilisateur
(traitement de textes, vidéo,...). Il fournit aux programmes applicatifs des points d’entrée génériques
pour les périphériques.

Le système Unix est un système d’exploitation


multi-utilisateur et multi-tâche
1 INTRODUCTION 5

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),

3 le super-utilisateur : chargé de gérer le système, c’est-à-dire de veiller au bon usage par


l’ensemble des utilisateurs des ressources partagées de la machine. Il dispose de privilèges
particuliers et d’un compte à part appelé root.

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 Partage des ressources équitables :


Unix veille à ce que toutes les ressources de l’ordinateur (processeur, mémoire,...) soient
partagées équitablement entre tous les processus.

3 Interface avec le matériel :


Pour accéder à une ressource matériel (disque dur, ports, lecteurs,...) on passe par des fichiers
spéciaux gérés par le SE.

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.

3 Gestion des fichiers :


Le système de fichiers est un système hiérarchisé arborescent. Unix fournit un mécanisme de
protection des fichiers.

Le système Unix est également le système privilégié


pour la communication entre ordinateurs
et entre utilisateurs.
6 2 CONNEXION - DÉCONNEXION

1.3 Architecture en couches

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

Outils • gestion E/S Matériel • gestion Compilateurs


graphiques mémoire

• 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 Autour du noyau gravite un certain nombre d’utilitaires.

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.

2.1 Procédure de connexion

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

2.2 Mot de passe

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

2.3 Procédure de déconnexion

En l’absence d’environnement graphique, une simple commande exit suffit pour terminer ma
session de travail.

3 Les commandes Unix

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

cd Changement de répertoire. Exemple : cd /usr/local/src (va dans le


répertoire /usr/local/src)
cd .. Aller dans le répertoire parent
ls Affiche le contenu d’un répertoire
ls -l Affiche le contenu d’un répertoire de façon détaillée
ls -a Affiche le contenu d’un répertoire en affichant également les fichiers
cachés
ls -la Affiche le contenu d’un répertoire y compris les fichiers cachés de
façon détaillée
ls -d Affiche uniquement les sous-répertoires d’un répertoire
ls -t Affiche le contenu d’un répertoire en classant par date de modification
cp Copie un ou plusieurs fichiers dans un répertoire cible. Exemple : cp fi-
chier1 /usr/local/src (copie fichier1 dans le répertoire /usr/local/src)
cp -f Copie un ou plusieurs fichiers dans un répertoire cible sans demande
de confirmation
cp -R Copie un répertoire ainsi que toute son arborescence dans un
répertoire cible. Exemple : cp -R /home/usr/KDE /usr/local/src (co-
pie le répertoire KDE dans /usr/local/src)
cp -Rf Copie un répertoire ainsi que toute son arborescence dans un
répertoire cible sans demande de confirmation
mkdir Crée un répertoire dans le répertoire courant ou dans un
répertoire cible. Exemple 1 : mkdir Documents (crée un répertoire
Documents dans le répertoire courant). Exemple 2 : mkdir
/usr/local/src/mes tarballs (crée le répertoire mes tarballs dans
/usr/local/src)
rmdir Supprime un répertoire si et seulement si celui-ci est vide
mv Déplace ou renomme un ou plusieurs fichiers. Exemple 1 : mv
toto titi (renomme le fichier toto en titi). Exemple 2 : mv fichier1
/home/user/Documents (déplace fichier1 dans le répertoire Docu-
ments). Exemple 3 : mv * .. (déplace tous les fichiers du répertoire
courant vers le répertoire parent)
rm Efface un ou plusieurs fichiers. Exemple : rm fichier1 (supprime fi-
chier1)
rm -f Efface un ou plusieurs fichiers dans demande de confirmation
rm -r Efface un répertoire ainsi que toute son arborescence. Exemple : rm
-R /home/user/Documents (efface le répertoire Documents)
rm -rf Efface un répertoire ainsi que toute son arborescence sans demande
de confirmation. Exemple : rm -rf /home/user/Documents * (efface
tous les fichiers et répertoires dans Documents)
su Prendre l’identité de root
su user Prendre l’identité d’un utilisateur
exit Quitter la session root
ln Crée un lien dur d’un fichier source dans un répertoire cible. Exemple :
ln fichier1 /usr/share/doc/fichier1 (crée un lien dur de fichier1 dans
/usr/share/doc)
ln -s Crée un lien symbolique d’un fichier source dans un répertoire cible.
Exemple 1 : ln -s fichier1 /usr/share/doc/fichier1 (crée un lien sym-
bolique de fichier1 dans /usr/share/doc). Exemple 2 : ln -s /dev/hdc
/dev/graveur (crée un lien symbolique nommé /dev/graveur du
périphérique /dev/hdc)
ln -sf Ecrase un lien symbolique d’un fichier source dans un répertoire cible.
Exemple : ln -sf /dev/hdd /dev/graveur (écrase le lien /dev/graveur
existant)
cat Affiche le contenu d’un fichier à l’écran. Exemple : cat
/home/user/mon fichier (affiche le contenu de mon fichier à l’écran)
cat /proc/cpuinfo Affiche des informations sur votre microprocesseur
less Affiche de façon progressive le contenu d’un fichier. Exemple : less
/home/user/mon fichier (affiche de façon progressive le contenu de
mon fichier à l’écran). Utilisez les flèches [haut] et [bas] pour faire
défiler et tapez sur la touche q pour quitter

Table 1 – Tableau des principales commandes Unix (1/3)


3 LES COMMANDES UNIX 9

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)

Table 2 – Tableau des principales commandes Unix (2/3)


10 3 LES COMMANDES UNIX

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

Table 3 – Tableau des principales commandes Unix (3/3)


4 LE SYSTÈME DE FICHIERS 11

Tab Complète automatiquement un nom de fichier ou de répertoire si


celui-ci est unique. Exemple : cd /usr/loc + Tab ça donne cd
/usr/local/
Tab Tab Si le nom n’a pas pu être complété, cela affiche la liste des possibilités
Flèche [haut] Remonte l’historique des commandes (la combinaison Ctrl + P est
équivalente)
Flèche [bas] Descend l’historique des commandes (la combinaison Ctrl + N est
équivalente)
Ctrl + c Stoppe le dernier processus lancé de façon brutale (destruction)
Ctrl + z Stoppe le dernier processus lancé et le met en file d’attente. Pour le
mettre en tâche de fond, tapez bg. Pour le faire revenir, tapez fg.
Ctrl + d Equivalent de la commande exit. Ferme le terminal en cours
Ctrl + Alt + Del Equivalent de la commande reboot. Redémarre l’ordinateur
Ctrl + Alt + Backspace Tue le serveur X. Retour au gestionnaire de sessions ou à la console
qui a lancé startx
Ctrl + Alt + Fn Permet de se déplacer dans les consoles virtuelles. 6 au total corres-
pondant aux touches F1, F2, F3, F4, F5, F6. F7 permet de revenir à
X Window
Alt + F2 Permet d’exécuter une commande
Ctrl + l Efface l’écran du terminal en cours
Ctrl + s Intérrompre le flot d’affichage
Ctrl + q Faire réapparaı̂tre le flot d’affichage

Table 4 – Les raccourcis-clavier indispensables

4 Le système de fichiers

4.1 Le fichier Unix

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 distingue trois types de fichiers :


— le fichier ordinaire : ensemble de données stockées sur un disque ou un dispositif analogue
(dvd-rom, clé,. . .)
— le répertoire : ensemble d’informations permettant d’accéder à d’autres fichiers
— le fichier spécial : représente un dispositif physique d’entrées/sorties (terminal, imprimante,
lecteur,. . .)

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 :

drwxrwxr-x d’autres infos bin


-rw-rw-r-- d’autres infos texte
12 4 LE SYSTÈME DE FICHIERS

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.

4.1.2 Opérations élémentaires sur les fichiers ordinaires

Affichage du contenu d’un fichier


cat fich : affiche sur la sortie standard le contenu des fichiers données en argument
more fich : affiche le contenu d’un fichier page par page
head fich : affiche le début d’un fichier
tail fich : affiche la fin d’un fichier
sort fich : trie les lignes d’un fichier

4.2 Arborescence de fichiers

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 :

un répertoire ne peut pas contenir son répertoire parent.

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

lib tmp bin usr dev etc home

cat cp local tty01 passwd util1

bin

bin : commandes système (ex : cp et cat)


lib : librairie pour la programmation
etc : fichiers de contrôle pour l’administration système
dev : fichiers spéciaux pour périphériques
usr : fichiers dédiés aux utilisateurs
tmp : fichiers temporaires utilisés par les éditeurs, les compilateurs et autres utilitaires
home : répertoire privé pour chaque utilisateur

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.

4.2.1 Premières commandes concernant l’arborescence

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 cd. Si l’utilisateur veut se déplacer du répertoire de travail à un autre répertoire,


il devra se servir de la commande cd (change directory). Dans son utilisation de base, la
commande cd ne prend qu’un argument : l’emplacement du répertoire que l’on veut atteindre.
L’emplacement d’un fichier dans l’arborescence est toujours référencée par 2 types d’informations :
— Référence absolue : chemin à partir de la racine
— Référence relative : chemin à partir du répertoire de travail
14 4 LE SYSTÈME DE FICHIERS

Dans les 2 cas, on sépare les noms des répertoires par un /.

Exemple 2. Considérons un utilisateur dans l’arborescence présentée précédemment. Supposons


que son répertoire de travail soit le répertoire usr contenu dans /. Si l’utilisateur utilise la
commande pwd il obtiendra /usr comme réponse (c’est-à-dire la référence absolue de son répertoire
de travail).
Si l’utilisateur veut se déplacer dans le répertoire bin contenu dans local il pourra utiliser la
référence relative : taper cd local/bin suivie par l’appui sur la touche Entrée.
Il pourra également utiliser la référence absolue : taper cd /usr/local/bin 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.

La commande mv. Pour renommer un fichier on utilise la commande mv. La syntaxe mv


fich source fich dest renomme le fichier fich source en fich dest. Si rep accueil est un
répertoire, la syntaxe mv fich rep accueil déplace le fichier fich dans rep accueil. Comme
pour cp et rm, on peut spécifier des chemins pour déplacer/renommer fichiers en dehors du 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.

Commande Options Arguments Effet

passwd Aucune Aucun change le mot de passe de l’utilisateur


cat Aucune fich affiche sur la sortie standard le contenu de fich
more Aucune fich affiche sur le contenu de fich page par page
head Aucune fich affiche sur le début de fich
tail Aucune fich affiche sur la fin de fich
sort Aucune fich trie les ligne de fich
ls Aucune Aucun affiche les fichiers contenus dans le répertoire de travail
-a Aucun affiche tous les fichiers du rép. de travail (aussi “cachés”)
-l Aucun affiche plus d’informations pour les fichiers du rép. de travail
-l fich
-i Aucun affiche les i-noed des fichiers du rép. de travail
-i fichier toto (chemin absolu ou rélatif) affiche l’i-noeud de toto
-i répertoire rep (chemin absolu ou rélatif) affiche les i-noeuds des fichiers de rep
-R Aucun liste récursivement les sous-répertoires du rép. de travail
et leur contenu
cd Aucune chemin (absolu ou rélatif) change le répertoire de travail
Aucune ∼ déplace l’utilisateur dans son répertoire personnel
Aucune Aucun déplace l’utilisateur dans son répertoire personnel
Aucune .. déplace l’utilisateur dans le répertoire parent
du répertoire de travail
touch Aucune chemin/toto crée le fichier ordinaire toto dans le chemin chemin
mkdir Aucune chemin/rep crée le répertoire rep dans le chemin chemin
cp Aucune chemin1/fich1 chemin2/fich2 copie chemin1/fich1 dans chemin2/fich2
rm Aucune chemin/fich1 supprime le fich. ordinaire fich1 qui se trouve dans chemin
-r chemin/rep supprime le répertoire rep qui se trouve dans chemin
mv Aucune chemin1/fich1 chemin2/fich2 déplace/change le nom de chemin1/fich1 en chemin2/fich2
16 4 LE SYSTÈME DE FICHIERS

4.3 Système de fichiers

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

file system / /tmp /home /usr

Arborescence globale :

/tmp /home /usr

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.

La commande ln et les liens symboliques. Des fichiers physiques différents appartenant à


des partitions logiques distinctes peuvent avoir le même index de i-nœud. Il n’est donc pas possible
de créer des liens entre différents systèmes de fichiers.
Le système Unix permet alors de créer des liens symboliques entre des fichiers appartenant à
différents file systems.
Un lien symbolique est un fichier contenant la référence absolue d’un autre fichier.
Attention : toute opération sur ce fichier (lecture, écriture, . . .) s’effectue sur le fichier référencé.
Un lien est créé pour pouvoir accéder au même fichier à différents endroits de l’arborescence. Pour
créer un lien symbolique il faut la commande ln avec l’option -s (symbolic).
La syntaxe ln -s fich source fich dest crée un lien symbolique fich dest contenant la
référence à fich source.
On conclut par une précision sur la commande ls dans ce contexte.
Si le répertoire de travail de l’utilisateur contient un lien symbolique alors la commande ls -l fait
apparaı̂tre le lien sous la forme fich dest -> fich source.

5 Protection des fichiers

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.

5.1 Droits d’accès aux fichiers : notation symbolique

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”

3 écriture (w pour write)


pour un répertoire, signifie ”créer ou détruire un fichier qui s’y trouve”
pour un fichier ordinaire, signifie ”créer, modifier ou supprimer le fichier”

3 autorisation d’exécution (x pour execute)


pour un répertoire, signifie ”accès aux fichiers et sous-répertoires contenus dans le
répertoire” i.e. ”traverser le répertoire”
pour un fichier ordinaire, signifie ”exécuter le fichier”
18 5 PROTECTION DES FICHIERS

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 -.

Exemple 4. Considérons un fichier ordinaire et supposons de vouloir représenter les droits


d’accès à ce fichier.
— Si l’utilisateur a tous les droits, la chaı̂ne sera rwx,
— si l’utilisateur peut lire et exécuter le fichier mais il ne peut pas le modifier, la chaı̂ne sera
r-x,
— si l’utilisateur peut seulement lire et modifier le fichier, la chaı̂ne sera rw-
Quel est la chaı̂ne qui nous indique que l’utilisateur n’a aucun droit sur le fichier ?

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)

3 les autres utilisateurs (o pour others – ce sont tous les autres)


En combinant les trois types d’accès et les trois classes d’utilisateurs, il y a donc neuf attributs
pour spécifier les droits d’accès à un fichier. Ces neuf attributs sont associés à une chaı̂ne de neuf
caractères : les trois premiers caractères se réfèrent au propriétaire, les trois suivants aux membres
du groupe du propriétaire, les trois derniers aux autres utilisateurs. Pour les droits de chaque type
d’utilisateur nous utilisons la même notation que celle de l’exemple 4.

Exemple 5. La chaı̂ne de caractères rwxrw-r-x nous dit que :


— le propriétaire a les droits rwx, c’est-à-dire il a tous les droits,
— les membres du groupe du propriétaire ont les droits rw-, c’est-à-dire ils peuvent seulement
lire et modifier le fichier, pas l’exécuter,
— les autres ont les droits r-x, c’est-à-dire ils peuvent seulement lire et exécuter le fichier, pas
le modifier.

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

5.2 Visualisation des droits d’accès

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

- rw-r--r-- 1 root root 1694 2007-06-18 08:49 /etc/passwd


taille en octets
groupe
utilisateur
nombre de liens sur ce fichier
ici
permissions des autres
permissions du groupe
permissions du propriétaire
type du fichier

La chaı̂ne -rw-r--r-- représente les droits d’accès au fichier /etc/passwd.

5.3 Notation absolue ou octale

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

5.4 Modification des utilisateurs et des droits d’accès

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 chown : changer le propriétaire. Nous pouvons changer le propriétaire d’un


fichier grâce à la commande chown. La commande chown a une syntaxe assez puissante qui permet
de changer le propriétaire et/ou le groupe. Toutefois, nous nous intéressons au cas où seul le
propriétaire change.
La syntaxe suivante,

chown nouveau propriétaire nom fichier

rend l’utilisateur nouveau propriétaire le nouveau propriétaire du fichier nom fichier.


Attention : la syntaxe précédente ne change pas le groupe du fichier, qui reste le même qu’avant.

La commande chgrp : changer le groupe. Nous pouvons changer le groupe d’un fichier,
grâce à la commande chgrp.
La syntaxe d’utilisation est :

chgrp nouveau groupe nom fichier.

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 :

chmod mode nom fichier

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,

mode p. déf. 110 110 110


¬masque 111 101 101
mode & (¬masque) 110 100 100

Les droits à la création d’un répertoire sont donnés par :

mode p. déf. 111 111 111


¬masque 111 101 101
mode & (¬masque) 111 101 101

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

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.

6.1 Métacaractères et expressions régulières

Souvent nous avons besoin de chercher (et trouver) :


— un ou plusieurs fichiers,
— du texte dans un fichier.
Ce type de recherche peut aussi être assez compliquée : par exemple, on pourrait vouloir trouver
tous les fichiers d’un répertoire dont les noms se terminent par .txt, ou chercher tous les mots
d’un fichier qui contiennent la chaı̂ne de caractères ‘‘ai’’ (vais, verlaine, paille, etc.).
Si l’on veut chercher un ou plusieurs fichiers dont on ne spécifie qu’une partie du nom, nous
pouvons utiliser les métacaractères.
Si l’on veut chercher du texte contenant une suite de caractères spécifique, nous pouvons utiliser
les expressions régulières.

Métacaractères. L’interpréteur de commandes permet de générer une liste de noms de fichier


en utilisant les métacaractères suivants, c’est-à-dire les caractères spéciaux suivants :

* : désigne toutes chaı̂nes de caractères, y compris la chaı̂ne vide


Par ex. : a*b désigne tous les noms de fichiers commençant par a et finissant par b
? : désigne un caractère quelconque
Par ex. : a?b désigne tous les noms de fichier commençant par a, suivi d’un caractère
et finissant par b
[. . .] : désigne un caractère quelconque appartenant à la liste donnée entre crochets
Le - permet de représenter un intervalle.
Par ex. : a[a-z0-9A-Z]b désigne tous les noms de fichiers commençant par a suivi
d’un caractère alphanumérique et finissant par b
[!. . .] : désigne une liste de caractères à exclure
Par ex. : a[!a-z]b désigne tous les noms de fichiers commençant par a suivi d’un
caractère autre qu’un caractère alphabétique en minuscule et finissant par b
Bien que nous avons introduit les métacaractères à propos de la recherche de fichiers (et donc pour
parler ensuite de la commande find), nous sommes autorisés à utiliser les mêmes métacaractères
avec les commandes pour afficher/manipuler les fichiers déjà connus : cp, mv, rm, ls, etc.
Exemple 10. La commande

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

La syntaxe des expressions régulières utilise les notations suivantes :


c : correspond au caractère c
. : caractérise n’importe quel caractère
[. . .] : n’importe quel caractère de l’ensemble spécifié
- pour définir un intervalle
[^ . . .] : n’importe quel caractère hors de l’ensemble spécifié
^ : caractérise le début de ligne (ne pas confondre ^ et [^ . . .])
Par ex. : ^ abc désigne une ligne commençant par abc
$ : caractérise la fin de ligne
Par ex. : abc$ désigne une ligne finissant par abc
^ $ : ligne vide
* : 0 à n fois le caractère la précédent
Par ex. : a* représente de 0 à n fois a
Par ex. : aa* représente de 1 à n fois a
Par ex. : .* désigne n’importe quelle chaı̂ne même vide
\c : banalise le métacaractère c qui perd sa signification particulière
ex : \. permet de rechercher un ., \* permet de rechercher un *, . . .

Exemple 11. L’expression regulière ^ [0-9][0-9]*$ correspond à la ligne ne contenant que des
chiffres et non vide.

6.2 La commande find : recherche d’un fichier.

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 :

— un répertoire de recherche duquel partir


— un critère de recherche (par exemple, le nom, la date de modification, la dimension en
octets, etc.)
— la(les) clé(s) de recherche (par exemple, pour une recherche sur la dimension, il faudra
spécifier la dimension que l’on souhaite)
— une action (c’est-à-dire ce que la commande find va faire après que la recherche est
terminée).

En conséquence, la syntaxe de la commande est la suivante :

find <répertoire de recherche> <critère de recherche> <clé(s)> <action>

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.

Le champ <critère de recherche> peut être l’un des suivants :


24 6 RECHERCHE DE FICHIERS ET DE TEXTE

-name : recherche sur le nom du fichier


Il faut spécifier la clé entre " et ".
Par ex. : find . -name "*.txt" -print
-perm : recherche sur les droits d’accès
Pour la clé, on peut utiliser la notation octale et symbolique.
La commande trouvera les fichiers qui ont exactement les droits spécifiés.
Par ex. : find . -perm u=rw,g=w -print affiche les fichiers avec droits d’accès 620.
-link : recherche sur le nombre de liens
-user : recherche sur le propriétaire
Il faut spécifier le nom exact du propriétaire.
-group : recherche sur le groupe auquel appartient le fichier
-type : recherche sur le type
(d=répertoire, c=caractère, f=fichier normal)
-size : recherche sur la taille
la clé doit être suivie par un caractère parmi c,w,b,k,M,G, en respectant la casse
Ce caractère correspond à l’unité de mésure : c=octets, w=mots de 2 octets,
b=blocs de 512 octets (valeur p. défaut), k=kilooctets, M=mégaoctets, G=gigaoctets,
Par ex. : find . -size 4096c -print cherche les fichiers de taille 4096 octets.
-atime : recherche sur la date de dernier accès en lecture
-mtime : recherche sur la date de dernière modification du fichier
-ctime : recherche sur la date de création du fichier
La date dans les derniers trois cas est spécifiée par le nombre de jours (entier)
On peut utiliser les opérateurs logiques suivants :
ET logique : critère1 critère2
NON logique : ! critère1
OU logique : \( critère1 -o critère2 \)
Attention : Ne jamais confondre " (guillemets) avec ’’ (pair de quotes) ou avec ‘‘ (pair de
anti-quotes). L’interpréteur de commandes va les traiter de façons différentes selon le contexte.

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 ?

6.3 La commande grep : recherche de texte.

Pour chercher du texte, on utilise la commande grep, qui a besoin de :


— une clé de recherche (appelée motif dans ce contexte)
— le nom du fichier dans lequel chercher le(s) mot(s).
En conséquence, la syntaxe de la commande grep est la suivante :
grep [option] ’motif’ nom fichier
On peut utiliser les expressions régulières pour décrire le motif et les métacaractères pour spécifier
les fichiers considérés.
7 MANIPULATION DE TEXTE : L’ÉDITEUR SED 25

Le champ option peut être :


-v : affiche les lignes ne contenant pas la chaı̂ne
-c : compte le nombre de lignes contenant la chaı̂ne
-n : chaque ligne contenant la chaı̂ne est numérotée
-x : ligne correspondant exactement à la chaı̂ne
-l : affiche le nom des fichiers qui contiennent la chaı̂ne
Les options peuvent être combinées comme dans les autres commandes, voir exemple 13.
La commande affiche les lignes contenant le motif (sauf si l’on utilise les options -c et -l).

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.

7 Manipulation de texte : l’éditeur sed

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).

Attention : ne pas mettre d’espaces entre caractérisation des adresses et commandes.


26 7 MANIPULATION DE TEXTE : L’ÉDITEUR SED

La commande de substitution s. La commande de substitution s permet de changer la


première ou toutes les occurences d’une chaı̂ne par une autre.
La syntaxe :
’l1,l2s/RE/remplacement/flags’
remplace les expressions régulières RE par la chaı̂ne de remplacement entre les lignes l1 et l2.
Dans ce cours, le champ flag sera :
g : global, c’est-à-dire toutes les occurences de la chaı̂ne RE (par défaut, seule la
première occurence est remplacée).
p : imprime la ligne modifiée (utile avec l’option -n).
w fichier : écrit la ligne dans le fichier spécifié en plus de la sortie standard.
On peut aussi spécifier un nombre entier n dans le champ flag. Dans ce cas, la commande s sera
appliquée uniquement à la n-ème chaı̂ne rencontrée correspondante à RE (voir exemple 15).
Exemple 15. On présente plusieurs utilisations de la commande s :
sed -e ’1,3s/toto/TOTO/’ fichier
change la première occurence de la chaı̂ne toto par TOTO (la première chaı̂ne toto rencontrée dans
le texte uniquement) dans les premières 3 lignes.
sed -e ’s/toto/TOTO/3’ fichier
change la troisième occurence de la chaı̂ne toto par TOTO (la troisième chaı̂ne toto rencontrée
dans le texte uniquement).
sed -e ’s/toto/TOTO/g’ fichier
toutes les chaı̂nes toto rencontrées sont changées.
sed -ne ’s/toto/TOTO/p’ fichier
seules les lignes modifiées sont affichées sur la sortie standard.
sed -e ’s/toto/TOTO/w resultat’ fichier
en cas de substitution la ligne en entrée est inscrite dans un fichier résultat.
On peut utiliser des expressions régulières :
sed -e ’s/[Ff]raise/FRAISE/g’ fichier
substitue toutes les chaı̂nes Fraise ou fraise par FRAISE.

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 commande de suppression d. La commande de suppresion d supprime les lignes comprises


dans un intervalle donné. La syntaxe est similaire à celle de la commande s. Comme pour la
commande s on peut spécifier un critère pour l’exécution de la commande. La commande !d
supprime les lignes qui ne satisfont pas un tel critère. Dans l’exemple suivant nous illustrons
l’utilisation de la commande d.
Exemple 17. La ligne de commande
sed -e ’20,30d’ fichier
supprime les lignes 20 à 30 du fichier fichier.
On peut utiliser des expressions régulières :
sed -e ’/toto/d’ fichier
supprime les lignes contenant la chaı̂ne toto.
8 LES PROCESSUS 27

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

Soient P1 , P2 , . . . , Pn , n programmes exécutés en même temps. Le système va, pendant un certain


laps de temps, exécuter l’un d’eux, par exemple Pi , sur le processeur. Si Pi se termine, l’exécution
de Pi+1 est lancée, sinon Pi est mis en attente par le système pour permettre l’exécution de Pi+1
pendant un nouveau laps de temps.
En conséquence, un programme ne s’exécute pas en continu durant une certaine période. Le cycle
d’exécution d’un programme se décompose en un grand nombre de périodes d’activité et d’attente.
Pour gérer cette activité multi-tâche, le système a besoin d’avoir en mémoire des informations sur
les programmes en exécution.
Un processus est un programme en cours d’exécution. On distingue deux types de processus :
3 Le processus système (daemons) : assure des services généraux accessibles à tous les
utilisateurs du système.
Le propriétaire est le root et il n’est sous le contrôle d’aucun terminal.

3 Le processus utilisateur : dédié à l’exécution d’une tâche particulière. Le propriétaire est


l’utilisateur qui l’exécute et il est sous le contrôle du terminal à partir duquel il a été lancé.

8.2 Cycle de vie d’un processus

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.

Exemple 18. Lorsqu’un utilisateur lance le shell, un processus (correspondant au “programme


shell”) est créé. Lorsqu’un utilisateur lance une commande depuis le shell, un processus est créé
dont le père est le processus correspondant à l’exécution du shell.

8.2.2 Etats d’un processus

→ Prêt (R) : le processus attend que le processeur lui soit affecté.

→ Actif (R) : le processus exécute le processus.

→ 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.

8.2.3 Politique de swapping

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.

8.2.4 Exécution d’une commande

Cinq modes d’exécution d’une commande sous Unix :


3 mode interactif : commande lancée à partir d’un terminal. Le contrôle du terminal n’est
rendu à l’utilisateur qu’à la fin de l’exécution de la commande.
<ctrl-c> : interrompre la commande
<ctrl-z> : suspendre la commande

3 mode en arrière plan : permet de rendre immédiatement le contrôle à l’utilisateur


(commande lancée suivie du caractère &). Si le terminal est fermé, la commande en arrière
plan est interrompue automatiquement. Pour éviter ce problème, il faut lancer la
commande sous le contrôle de la commande nohup (syntaxe : nohup nom commande &).

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.

3 mode cyclique : tâche exécutée de façon cyclique.

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

— SIGINT (signal 2) : interrompre l’exécution d’un processus,


— SIGKILL (signal 9) : arrêter définitivement l’exécution d’un processus (ne peut pas être
ignoré),
— SIGTSTP (signal 20) : suspendre temporairement l’exécution d’un processus,
— SIGCONT (signal 18) : reprendre l’exécution d’un processus précédemment suspendu par
l’envoi d’un signal SIGTSTP.
Un signal peut être envoyé par :
3 le système (ex : signaux d’erreur),

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.

La syntaxe de la commande kill est la suivante :

kill -signal PID

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.

8.2.5 Le job control

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.

→ arrière plan : Le job s’exécute et vous avez la main sur le shell.

→ suspendu : Le job est en attente, il ne s’exécute pas.

Les commandes jobs, bg, fg.


jobs : permet de lister les jobs en cours
<ctrl-z> : suspendre une commande en avant plan
bg %num job : basculer de suspendu à arrière plan
fg %num job : passer en avant plan
<ctrl-c> : tuer une commande en avant plan
Dans la figure suivante nous observons les possibles actions accomplies par ces commandes.
30 8 LES PROCESSUS

Interruption

Ctrl-c

Tâche en Tâche en
premier plan fg tache arrière plan

commande commande &


fg tache bg tache

Tâche en
Ctrl-z stoppée

8.3 Les fichiers standards et les redirections

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.

8.4 Enchaı̂nement de processus

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.

Lancement en séquence de plusieurs commandes. Pour lancer en séquence plusieurs


commandes on utilise un ; séparant les commandes. Par exemple la ligne de commande,
commande1 ; commande2 ; commande3 > fich
crée le processus qui exécute commande1, puis quand commande1 est terminé, crée le processus qui
exécute commande2 . . .
9 LES INTERPRÉTEURS DE COMMANDES 31

Attention : Les différents processus ne co-existent pas.


En conséquence, dans l’exemple précédent, seule la sortie standard de commande3 est redirigée vers
fich.
Pour rediriger les trois commandes :
(commande1 ; commande2 ; commande3) > fich

Lancement concurrent de processus communiquant par un tube (pipe). Il est possible


de lancer l’exécution simultanée de plusieurs processus échangeant des données par l’intermédiaire
de zones mémoires appelées tubes.
La syntaxe à utiliser à ce propos est la suivante :
com1 | com2 | . . . | comn
Le système crée n − 1 tubes et n processus. Ensuite :
— le processus qui exécute com1 a sa sortie standard redirigée vers le premier tube, son entrée
standard étant celle définie par défaut, à savoir le clavier,
— le processus qui exécute com2 a son entrée standard redirigée vers le premier tube et sa
sortie standard redirigée vers le deuxième tube,
— ...
— le processus qui exécute comn a son entrée standard redirigée vers le n − 1ème tube, sa
sortie standard étant celle par défaut, à savoir l’écran.

Les n processus coexistent et se partagent l’accès au processeur. Le système se charge de leur


synchronisation : les processus lecteurs sont mis en attente tant que leur tube en entrée est vide,
les processus écrivains sont mis en attente si leur tube en sortie est plein.

Exemple 19. La ligne de commande


ls /bin /usr/local/bin | grep ’cp’ | wc -l
permet de compter le nombre de fichiers dont le nom contient la chaı̂ne cp dans les répertoires
/bin et /usr/local/bin. Toutefois filtrer la sortie de ls n’est pas consideré une bonne pratique.

9 Les interpréteurs de commandes

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,

• zsh : un des derniers nés (1990) de la famille, très complet.


32 9 LES INTERPRÉTEURS DE COMMANDES

3 La famille des C-shell (Université de Berkeley) :

• csh : dont le langage de programmation est très proche du langage C,

• tcsh : compatible avec le C-shell et beaucoup plus complet.

On appelle login-shell, le shell attribué (par défaut) à un utilisateur à l’issue de la procédure de


login. À son lancement, ce shell exécute des commandes lues dans des fichiers de configuration.

Pour changer temporairement de shell en cours de session :


nom du shell ←-
exit ou ctrl-d pour quitter ce shell

9.2 Interprétation des commandes par le shell

Trois étapes :

1. Lecture de la commande et séparation de celle-ci en mots.

2. Application de mécanismes de substitution.

3. Exécution.

Les mécanismes de substitution

1. Historique : Réappeler des commandes précédemment exécutées par le shell courant.

2. Alias : Attribuer des surnoms (alias) à des commandes particulières.


Définition d’un alias : alias nom alias commande
alias ←- : donne la liste des alias définis
Suppression d’un alias : unalias nom alias

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 (*, ?, [. . .], [!. . .]).

Les caractères spéciaux communs aux différents shells

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

\ : despécialisation du caractère suivant


ESPACE et TAB : séparateurs de mots
NEWLINE : fin de commande
& : lancement d’une commande en arrière plan
| : tube
; : séparateur de commandes
< << >> > : redirection des entrées/sorties standards
() : délimiteurs de commandes
‘’" : délimiteurs de chaı̂nes
$var : valeur de la variable var
! : inverse la valeur renvoyée par un test, ou d’un code de sortie (voir après)
# : début d’un commentaire dans un fichier interprété par shell
&& : exécution conditionnelle de commande
com1 && com2 ⇔ com1 est exécutée et si com1 aboutit, com2 est exécutée
|| : exécution conditionnelle de commande
com1 || com2 ⇔ com1 est exécutée et si com1 échoue, com2 est exécutée
% : référence à une tâche dans le mécanisme de job control
∼ nom logique : symbolise le répertoire privé d’un utilisateur
Les délimiteurs de chaı̂nes de caractères :
— les quotes simples (’) :
dans une chaı̂ne délimitée par des quotes simples, tous les caractères perdent leur aspect
spécial et bash ne sépare pas la chaı̂ne en mots.
— les anti-quotes (‘) :
une chaı̂ne délimitée par des anti-quotes est interprétée comme une commande et le résultat
de la commande lui est substitué
— les guillemets (") :
dans une chaı̂ne délimitée par des guillemets, les caractères NEWLINE, !, $, \ et ‘ sont les
seuls à être interprétés.

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

Modifieurs dédiés au traitemenent des noms de fichier :


:h Supprime la partie droite d’une référence absolue à un fichier (reste le chemin
d’accès)
:t Supprime le chemin d’accès dans une référence absolue à un fichier (reste le nom du
fichier)
:r Supprime les suffixe du type .xxx les plus à droite d’un nom de fichier
:e Ne conserve que le suffixe d’un nom de fichier
:p Imprime le résultat de la séléction, sans l’exécuter

Modifieurs permettant d’effectuer des substitutions :


:s/str1/str2/ La 1ère occurence de la chaı̂ne str1 dans la chaı̂ne référencée est remplacée
par la chaı̂ne str2. Le caractère / final peut être omis lorsque str2 est
immédiatement suivi du caractère newline.

:gs/str1/str2/ Permet d’appliquer la substitution à chacun des mots de la chaı̂ne


référencée.

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

9.3.1 Les variables du Bash.

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.

Affichage, définition et suppression de variables. Les variables peuvent être globales ou


locales. Les variables globales sont disponibles dans tous les shells. Les variables locales sont
disponibles dans le shell courant.
Pour connaı̂tre les variables globales, l’utilisateur peut utiliser la commande printenv
Pour connaı̂tre les variables globales et locales, l’utilisateur peut utiliser la commande set
(sans aucun argument).
Attention : Par convention, les variables globales sont écrites en utilisant des lettres majuscules
(par ex., HOME) ; les variables locales sont écrites avec des lettres minuscules.
Pour créer une variable locale nommée var et lui affecter une valeur valeur, on utilise = avec la
syntaxe suivante :
var="valeur"
Attention : à ce propos, il faut que l’utilisateur observe strictement certaines règles.
En ce qui concerne les noms de variables, il faut qu’ils soient des mots contenant uniquement des
lettres, des chiffres et des “underscore” et commençant par une lettre ou par un “underscore”.
L’utilisateur ne devra pas faire précéder, ni suivre, le signe = par des espaces. Une écriture du
type var = valeur est interprétée par Bash comme l’exécution d’une commande var dont les
arguments sont = et valeur .
Finalement, les guillemets (") autour de valeur ne sont pas obligatoires, mais fortement
recommandés.
Quand on a terminé d’utiliser une variable locale var on peut supprimer sa définition avec la
commande unset :
unset var

Expansion de variables. Bash met à disposition de l’utilisateur le mécanisme d’expansion de


paramètres pour utiliser la valeur d’une variable. Ce mécanisme effectue une substitution du
paramètre par sa valeur. Pour invoquer l’expansion d’une variable on utilise $.

Exemple 21. L’utilisateur tape var="toto". Alors, la ligne de commande


echo "$var"
affiche toto.
En effet, grâce au mécanisme d’expansion, var est d’abord remplacée par sa valeur (toto) et
ensuite le résultat est passé comme argument à la commande echo. La commande echo simplement
affiche la chaı̂ne de caractère donnée en argument (utiliser man echo pour plus d’informations).

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.

Exemple 22. Le répertoire de travail de l’utilisateur contient le fichier Peu important.txt et le


fichier important.txt . Il tape
monfichier="Peu important.txt"
36 9 LES INTERPRÉTEURS DE COMMANDES

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.

9.3.2 Les scripts en Bash

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.

Attention : Ne pas oublier que, dans ce contexte, 0 =succès, > 0 =erreur.


Les opérateurs && et || se servent des codes de sorties pour fonctionner. La syntaxe de && est la
suivante :
commande1 && commande2
La commande1 est toujours exécutée. Si la commande1 sort avec succès (code=0) alors commande2
est aussi exécutée. Sinon elle n’est pas exécutée.
La syntaxe de || est la suivante :
commande1 || commande2
La commande1 est toujours exécutée. Si la commande1 sort avec erreur (code> 0) alors commande2
est exécutée. Sinon elle n’est pas exécutée.
38 9 LES INTERPRÉTEURS DE COMMANDES

Structures conditionnelles La structure if-then-elif-else permet de contrôler des


conditions. La syntaxe générale est la suivante :

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

Le if exécute les commandes COMMANDES 1, et si le code de sortie est 0 (succès) il exécute


SUITE-DE-COMMANDES 1 et on sort de la structure. Si le code n’est pas 0, elif exécute
COMMANDES 2. Si le code de sortie dans ce cas est 0, SUITE-DE-COMMANDE 2 est exécutée et on sort
de la structure. Sinon on passe au elif suivant. On procède jusqu’à atteindre le dernier elif. Si
COMMANDES (m-1) sort avec un code positif, alors SUITE-DE-COMMANDES m est exécutée et on sort de
la structure.
La structure if-then-elif-else est souvent utilisée pour analyser des conditions. À ce propos,
nous introduisons la syntaxe pour effectuer des tests :

if [[ EXPRESSION ]]
then
COMMANDES
fi

EXPRESSION peut être l’une des suivantes :


— cha^
ıne 1 = cha^ ıne 2 (faire attention aux espaces ! !).
Contrôle si les chaı̂nes sont les mêmes.
Les chaı̂nes peuvent en réalité contenir des métacaractères.
— cha^
ıne 1 != cha^ ıne 2 (faire attention aux espaces ! !).
Contrôle si les chaı̂nes sont différentes.
— cha^
ıne 1 > cha^ ıne 2 (faire attention aux espaces ! !).
Contrôle si cha^ ıne 1 est supérieure à cha^
ıne 2.
— -e fichier . Contrôle si fichier existe.
— -f fichier . Contrôle si fichier existe et s’il est un fichier ordinaire.
— -d fichier . Contrôle si fichier existe et s’il est un répertoire.
— -s fichier . Contrôle si fichier existe et s’il a une taille non nulle.
— -r fichier . Contrôle si fichier existe et s’il peut être lu.
— -h fichier . Contrôle si fichier est un lien symbolique.
— -w fichier . Contrôle si fichier existe et s’il peut être écrit.
— -x fichier . Contrôle si fichier existe et s’il peut être exécuté.
— -O fichier . Contrôle si fichier appartient à l’utilisateur.
— ! EXPR . Inverse le résultat de EXPR.
— EXPR1 && EXPR2 . Exercice pour le lecteur !
— EXPR1 || EXPR2 . Exercice pour le lecteur !
9 LES INTERPRÉTEURS DE COMMANDES 39

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 |.

Exemple 25. La structure suivante

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

contrôle quelle est la langue utilisée sur le système.

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 :

for VARIABLE in MOTS


do
COMMANDES
done

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

Exemple 26. La structure suivante

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 )) .

Exemple 27. La ligne de commande


echo $(( 3+2 ))
affiche 5 .

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

— +, - pour somme et différence ;


— *, /, % pour produit, division et reste de division ;
— ==, != pour égalité ou inégalité ;
— ++ pour incrémenter ;
— ** pour l’exponentiel.
Exemple 28. Le script suivant calcule la factorielle d’un nombre entier passé en argument.
if (( $# != 1 ))
then
echo "Donner exactement 1 argument..."
else
a=1
i=1
while ((i <= $1))
do
((a=$a*$i))
((++i))
done
echo $a
fi
Exemple 29. Le script suivant calcule la somme des nombres entiers passés en argument.
a=0
for i in $@
do
(( a += $i ))
done
echo $a

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 :

read [-option] var1 var2 ...var n

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 :

read -p "message" var1 var2 ...var n

Dans l’exemple 30, le script demande deux entiers à un utilisateur et en affiche la somme.
Exemple 30.
#!/bin/bash

read -p "1er nombre entier: " num1


read -p "2ème nombre entier: " num2

echo $(( num1+num2 ))

Vous aimerez peut-être aussi