Cours Unix - Richard Grin

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 78

ii TABLE DES MATIRE

Table des matires


Universit de Nice Sophia-Antipolis
Prsentation du polycopi i

I Connaissances de base
1 Gnralits sur Unix
Unix 1.1
1.2
1.3
Systmes d'exploitation . . . . . . . .
Historique . . . . . . . . . . . . . . .
Standards et versions d'Unix . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1.4 Proprits d'Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
et 1.5 Structure d'Unix . . . . . . . . . . .
1.5.1 Noyau . . . . . . . . . . . . .
1.5.2 Shell . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1.6 Organisation des systmes de chiers . . . . . . . . . . . . . . . . . . . . .
programmation du shell 1.6.1 Systme de chiers . . . . . .
1.6.2 Types de chiers . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2 Acteurs/objets du monde Unix
2.1 Utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Version 3.0 2.1.1 Un utilisateur dans le systme . . . . . . . . . . . . . . . . . . . . .
2.1.2 Super-utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.1.3 Administrateur du systme . . . . . . . . . . . . . . . . . . . . . . . 1
Richard Grin 2.2 Processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Signaux envoys aux processus . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
1
1
2.2.2 Terminal de contrle d'un processus, excution en arrire-plan . . . 1
31 juillet 1998 2.2.3 Propritaires et groupes eectifs et rels d'un processus . . . . . . . 1
2.2.4 Cration d'un nouveau processus, arbre des processus . . . . . . . . 1
2.3 Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.3.1 i-node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.3.2 Structure interne des rpertoires . . . . . . . . . . . . . . . . . . . . 1
2.3.3 Propritaire et groupe d'un chier . . . . . . . . . . . . . . . . . . . 1
2.3.4 Mode d'accs au chier . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.4 Protection des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
TABLE DES MATIRES iii iv TABLE DES MATIRE
2.4.1 Droits associs aux autorisations . . . . . . . . . . . . . . . . . . . 16 6 Commandes d'observation du systme 3
2.4.2 Autorisations set user id et set group id . . . . . . . . . . . . . . 16 6.1 Date et Heure (date) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.4.3 Mcanisme de protection des chiers . . . . . . . . . . . . . . . . . 17 6.2 Nom de l'ordinateur (hostname) . . . . . . . . . . . . . . . . . . . . . . . . 3
6.3 Nom du systme d'exploitation (uname) . . . . . . . . . . . . . . . . . . . 3
3 Premiers pas dans le systme 18 6.4 Information sur les utilisateurs (who, nger) . . . . . . . . . . . . . . . . . 3
3.1 Entre dans le systme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6.5 Dernires connexions au systme (last) . . . . . . . . . . . . . . . . . . . . 3
3.1.1 Changer son mot de passe (passwd) . . . . . . . . . . . . . . . . . . 18 6.6 Systme  Network Information Service (NIS) . . . . . . . . . . . . . . . . 3
3.1.2 Dmarrage d'une session . . . . . . . . . . . . . . . . . . . . . . . . 19 6.7 Espace disque occup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.2 Sortie du systme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 Touches spciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 6.7.1 Place occupe par la branche d'un rpertoire (du) . . . . . . . . . . 3
3.4 Format des commandes Unix . . . . . . . . . . . . . . . . . . . . . . . . . . 20 6.7.2 Place libre d'un systme de chiers (df) . . . . . . . . . . . . . . . . 3
3.5 Consultation du manuel en ligne (man) . . . . . . . . . . . . . . . . . . . . 21 6.8 Nom du terminal utilis (tty) . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.6 Nom d'un chier, nom absolu, nom relatif . . . . . . . . . . . . . . . . . . 22
3.7 Commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 7 Commandes pour la gestion des processus 4
3.7.1 Lancer une commande, supprimer un processus . . . . . . . . . . . 22 7.1 Processus en cours d'excution (ps) . . . . . . . . . . . . . . . . . . . . . . 4
3.7.2 Nom d'une commande, variable PATH . . . . . . . . . . . . . . . . 22 7.2 Supprimer un processus en cours d'excution (kill) . . . . . . . . . . . . . . 4
3.7.3 Nom complet et type d'une commande (whence, whereis) . . . . . . 23 7.3 Lancement automatique de processus  des moments donns (at, crontab) . 4
3.7.4 Compltion des commandes par zsh . . . . . . . . . . . . . . . . . . 24 7.4 Gestion du plan d'un processus par le shell . . . . . . . . . . . . . . . . . . 4
8 Acher, imprimer, envoyer le contenu d'un chier 4
II Commandes 25 8.1 Acher le contenu d'un chier, concatner plusieurs chiers (cat) - Notion
de redirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4 Commandes lies
l'arborescence des chiers 27 8.2 Acher les octets d'un chier (od) . . . . . . . . . . . . . . . . . . . . . . 4
4.1 Visualisation de l'arborescence (ls) . . . . . . . . . . . . . . . . . . . . . . 27 8.3 Acher page  page (more) - Notion de pipe . . . . . . . . . . . . . . . . . 4
4.2 Information dtaille sur les chiers (ls -l) . . . . . . . . . . . . . . . . . . 28 8.4 Sorties sur les imprimantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.2.1 Format d'achage . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 8.4.1 Informations sur le systme d'impression (lpstat, printcap) . . . . . 4
4.2.2 Types de chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 8.4.2 Lancement d'une requte d'impression (lpr) . . . . . . . . . . . . . 4
4.2.3 Mode d'accs au chier . . . . . . . . . . . . . . . . . . . . . . . . . 29 8.4.3 Informations sur les requtes d'impression (lpq) . . . . . . . . . . . 4
4.2.4 Nombre de liens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 8.4.4 Suppressions de requtes d'impression (lprm, cancel) . . . . . . . . 4
4.3 Se dplacer dans l'arborescence (cd) . . . . . . . . . . . . . . . . . . . . . . 30 8.5 Envoyer le contenu d'un chier (mail) . . . . . . . . . . . . . . . . . . . . . 4
4.4 Acher le rpertoire courant (pwd) . . . . . . . . . . . . . . . . . . . . . . 30 8.6 Mise en page (pr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.5 Caractres spciaux pour le shell . . . . . . . . . . . . . . . . . . . . . . . 30
4.5.1 Gnration des noms de chiers (*,?, ) . . . . . . . . . . . . . . . . 30 8.7 Passer en Postscript (a2ps) . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.5.2 Le caractre spcial  . . . . . . . . . . . . . . . . . . . . . . . . . 31 9 Gestion des chiers 5
4.5.3 Le caractre spcial # . . . . . . . . . . . . . . . . . . . . . . . . . 32 9.1 Copier des chiers (cp) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.5.4 Autres caractres spciaux . . . . . . . . . . . . . . . . . . . . . . . 32
4.6 Acher le type d'un chier ( le) . . . . . . . . . . . . . . . . . . . . . . . . 32 9.2 Liens avec mme numro de i-node (ln) . . . . . . . . . . . . . . . . . . . . 5
4.7 Rechercher des chiers dans l'arborescence ( nd, locate) . . . . . . . . . . 32 9.3 Liens symboliques (ln -s) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
9.4 Supprimer des chiers (rm) . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5 Protection des chiers 35 9.5 Dplacer, renommer des chiers (mv) . . . . . . . . . . . . . . . . . . . . . 5
5.1 Changement des autorisations (chmod) . . . . . . . . . . . . . . . . . . . . 35 9.6 Sauvegarder sur les lecteurs de disquettes des stations Sun . . . . . . . . . 5
5.2 Masque pour les autorisations (umask) . . . . . . . . . . . . . . . . . . . . 36 9.7 Compression et dcompression (zip, gzip, compress) . . . . . . . . . . . . . 5
TABLE DES MATIRES v vi TABLE DES MATIRE
10 Travail sur les rpertoires 55 13.9.1 Description gnrale de l'diteur . . . . . . . . . . . . . . . . . . . . 8
10.1 Crer un rpertoire (mkdir) . . . . . . . . . . . . . . . . . . . . . . . . . . 55 13.9.2 Structure d'une ligne de programme . . . . . . . . . . . . . . . . . . 8
10.2 Supprimer un rpertoire (rmdir, rm -r)) . . . . . . . . . . . . . . . . . . . . 55 13.9.3 Format pour indiquer les lignes  traiter . . . . . . . . . . . . . . . 8
10.3 Changer le nom d'un rpertoire (mv) . . . . . . . . . . . . . . . . . . . . . 55 13.9.4 Excution du programme . . . . . . . . . . . . . . . . . . . . . . . . 8
10.4 Copier l'arborescence d'un rpertoire (cp -r) . . . . . . . . . . . . . . . . . 56 13.9.5 Commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
10.5 Lien symbolique (ln -s) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 13.10Un langage d'dition de chiers (awk) . . . . . . . . . . . . . . . . . . . . . 8
10.6 Pliage de rpertoires en une seul chier (tar, cpio) . . . . . . . . . . . . . . 57 13.10.1Description gnrale de la commande . . . . . . . . . . . . . . . . . 8
13.10.2Champs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
11 Expressions rgulires 58 13.10.3Structure d'un programme . . . . . . . . . . . . . . . . . . . . . . . 8
11.1 Expressions rgulires reprsentant un seul caractre . . . . . . . . . . . . 58 13.10.4Cas particuliers pour une ligne de programme . . . . . . . . . . . . 8
11.2 Expressions rgulires reprsentant un ensemble de caractres d'un seul type 59 13.10.5Slecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
11.3 Autres expressions rgulires . . . . . . . . . . . . . . . . . . . . . . . . . . 60 13.10.6Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
13.10.7Fonctions, oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . 8
12 diteur de texte (emacs, xemacs) 62 13.11Exemples de programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
12.1 Entre et sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 13.12Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
12.1.1 Lancer emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 13.13D'autres commandes de manipulation de chiers . . . . . . . . . . . . . . . 8
12.1.2 Sortir de emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
12.2 Concepts de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
12.2.1 Description d'une fentre emacs . . . . . . . . . . . . . . . . . . . . 63 III Mcanismes d'interprtation du shell 8
12.2.2 Commandes et associations de cls . . . . . . . . . . . . . . . . . . 64
12.2.3 Buers et fentres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 14 Interprtation du shell. Mcanismes de base 9
12.2.4 Point d'insertion, marque, rgions . . . . . . . . . . . . . . . . . . . 67 14.1 Gnralits sur le shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
12.2.5 Mode de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 14.1.1 D nition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
12.3 Commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 14.1.2 Compatibilit des dirents shells . . . . . . . . . . . . . . . . . . . 9
12.3.1 Commandes de base . . . . . . . . . . . . . . . . . . . . . . . . . . 68 14.1.3 Commandes et processus, commandes internes au shell . . . . . . . 9
12.3.2 Autres commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 14.1.4 Prompts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
12.4 Personnalisation de emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 14.1.5 Environnement d'une commande ou d'un shellscript . . . . . . . . . 9
12.5 Complments pour les versions graphiques . . . . . . . . . . . . . . . . . . 72 14.1.6 Code retour d'une commande . . . . . . . . . . . . . . . . . . . . . 9
14.2 Redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
13 Manipulation des donnes des chiers 73 14.2.1 Redirections de la sortie standard . . . . . . . . . . . . . . . . . . . 9
13.1 Tri (sort) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 14.2.2 Redirection du chier d'erreur (2>) . . . . . . . . . . . . . . . . . . 9
13.2 Recherche d'une cha ne de caractres (grep) . . . . . . . . . . . . . . . . . 74 14.2.3 Envoi d'un message d'erreur (>&2) . . . . . . . . . . . . . . . . . . 9
13.3 Compter les caractres, les mots, les lignes (wc) . . . . . . . . . . . . . . . 74 14.2.4 Redirection de l'entre standard (<) . . . . . . . . . . . . . . . . . 9
13.4 Conversion, suppression de caractres (tr) . . . . . . . . . . . . . . . . . . 75 14.2.5 Pseudo- chier /dev/null . . . . . . . . . . . . . . . . . . . . . . . . 9
13.5 Fractionnement vertical (cut) . . . . . . . . . . . . . . . . . . . . . . . . . 76 14.3 Pipe (j) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
13.6 Comparaison du contenu de 2 chiers . . . . . . . . . . . . . . . . . . . . . 78 14.4 Regroupement des commandes . . . . . . . . . . . . . . . . . . . . . . . . . 9
13.6.1 Dirences entre deux chiers texte (di) . . . . . . . . . . . . . . . 78 14.4.1 Regroupement entre parenthses . . . . . . . . . . . . . . . . . . . . 9
13.6.2 !galit du contenu de 2 chiers (cmp) . . . . . . . . . . . . . . . . 78 14.4.2 Regroupement entre accolades . . . . . . . . . . . . . . . . . . . . . 9
13.7 Traiter les lignes conscutives identiques (uniq) . . . . . . . . . . . . . . . 79 14.5 Processus en arrire-plan (&) . . . . . . . . . . . . . . . . . . . . . . . . . 9
13.8 Extraire le dbut ou la n d'un chier . . . . . . . . . . . . . . . . . . . . . 79 14.5.1 Gestion des jobs par ksh ou zsh . . . . . . . . . . . . . . . . . . . 9
13.8.1 Dbut d'un chier (head) . . . . . . . . . . . . . . . . . . . . . . . . 79 14.6 Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
13.8.2 Fin d'un chier (tail) . . . . . . . . . . . . . . . . . . . . . . . . . . 79 14.7 Substitution de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
13.9 Un diteur non interactif (sed) . . . . . . . . . . . . . . . . . . . . . . . . . 80 14.8 Mcanismes d'interprtation . . . . . . . . . . . . . . . . . . . . . . . . . . 9
TABLE DES MATIRES vii viii TABLE DES MATIRE
14.9 Inhiber l'interprtation du shell . . . . . . . . . . . . . . . . . . . . . . . . 99 16.5.4 Modi cation interactive de la valeur d'une variable sous zsh (vared) 12
14.10Recherche d'une commande par le shell . . . . . . . . . . . . . . . . . . . . 100 16.5.5 Tableaux sous ksh et zsh . . . . . . . . . . . . . . . . . . . . . . . . 12
14.11Lancement de l'excution d'un shellscript . . . . . . . . . . . . . . . . . . . 100
14.11.1Lancement par le nom du shellscript . . . . . . . . . . . . . . . . . 100
14.11.2Lancement par l'appel de la commande interne . . . . . . . . . . . 102 IV Programmation 12
14.11.3Lancement par l'appel explicite d'un shell . . . . . . . . . . . . . . 102
14.12Lancement explicite d'un shell . . . . . . . . . . . . . . . . . . . . . . . . . 103 17 Programmation des shellscripts 12
17.1 Tests divers (test,  ... ],  ... ]]) . . . . . . . . . . . . . . . . . . . . . . . . 12
15 Variables, environnement 104 17.2 Dcaler les paramtres de position (shift) . . . . . . . . . . . . . . . . . . . 12
15.1 Paramtres, variables de position . . . . . . . . . . . . . . . . . . . . . . . 104 17.3 Sortie d'un shellscript (exit) . . . . . . . . . . . . . . . . . . . . . . . . . . 12
15.1.1 Paramtres des shellscripts . . . . . . . . . . . . . . . . . . . . . . . 104 17.4 Les structures de contrle . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
15.1.2 Donner des valeurs aux paramtres de position (set) . . . . . . . . . 104 17.4.1 if .. then .. else .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
15.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 17.4.2 case ... esac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
15.2.1 Identi cateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 17.4.3 for ... do ... done . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
15.2.2 Aectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 17.4.4 while ... do ... done . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
15.2.3 Dsignation de la valeur de la variable ($) . . . . . . . . . . . . . . 105 17.4.5 until ... do ... done . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
15.2.4 Dcomposition en mots des valeurs des variables de zsh . . . . . . . 106 17.4.6 Instructions lies aux boucles (continue, break) . . . . . . . . . . . 13
15.2.5 Supprimer une variable (unset) . . . . . . . . . . . . . . . . . . . . 106 17.4.7 Problmes avec les boucles rediriges et les pipes . . . . . . . . . . . 13
15.2.6 Variables spciales du shell . . . . . . . . . . . . . . . . . . . . . . . 106 17.5 Interception des signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
15.2.7 Acher la valeur d'une variable (echo) . . . . . . . . . . . . . . . . 108 17.6 Commandes internes diverses . . . . . . . . . . . . . . . . . . . . . . . . . 13
15.2.8 Entre de la valeur d'une variable au clavier (read) . . . . . . . . . 108 17.7 Rcursivit dans l'excution des shellscripts . . . . . . . . . . . . . . . . . 13
15.2.9 Porte d'une variable (export), environnement de travail . . . . . . 109 17.8 Calculs, traitement des cha nes de caractres . . . . . . . . . . . . . . . . . 13
15.2.10Visualisation des variables disponibles (set, printenv) . . . . . . . . 110 17.8.1 Commande expr . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
15.3 Personnalisation de l'environnement . . . . . . . . . . . . . . . . . . . . . . 110 17.8.2 Commande let . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
15.3.1 Options des shells (set, setopt) . . . . . . . . . . . . . . . . . . . . . 110 17.9 Traitement des cha nes de caractres . . . . . . . . . . . . . . . . . . . . . 13
15.3.2 Fichiers de personnalisation . . . . . . . . . . . . . . . . . . . . . . 110 17.10Aide pour traiter les options (getopts) . . . . . . . . . . . . . . . . . . . . 13
15.4 Stratgie pour la personnalisation de l'environnement . . . . . . . . . . . . 112 17.11Mise au point des shellscripts (set -xv) . . . . . . . . . . . . . . . . . . . . 13
16 Complments sur le shell 113
16.1 Listes de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
16.2 Ordre de priorit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
16.3 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
16.4 Complments sur les redirections . . . . . . . . . . . . . . . . . . . . . . . 115
16.4.1 Redirection de l'entre standard sur chier inclus (<<) . . . . . . . 115
16.4.2 Redirection pour tout un shell (exec) . . . . . . . . . . . . . . . . . 116
16.4.3 Descripteurs de chier suprieurs  2 . . . . . . . . . . . . . . . . . 116
16.4.4 Redirection vers un chier dsign par son descripteur . . . . . . . . 117
16.4.5 Ordre d'valuation des redirections . . . . . . . . . . . . . . . . . . 117
16.4.6 Redirection sans commande avec zsh . . . . . . . . . . . . . . . . . 118
16.5 Complments sur les variables . . . . . . . . . . . . . . . . . . . . . . . . . 118
16.5.1 Valeurs par dfaut pour les variables . . . . . . . . . . . . . . . . . 118
16.5.2 Modi er l'environnement d'une commande . . . . . . . . . . . . . . 119
16.5.3 Facilits de ksh et zsh pour le traitement des valeurs de variables . 119
ix

Prsentation du polycopi
Ce polycopi est un support du cours donn dans direntes lires de l'Universit de
Nice-Sophia Antipolis.
Le cours est une introduction au systme d'exploitation Unix. Le but est de prsenter,
 travers des cas concrets d'utilisation sous le systme Unix, les concepts essentiels des
systmes d'exploitation utiles  un utilisateur averti.
La programmation des shellscripts qui fait si souvent gagner un temps prcieux dans
l'excution des t&ches rptitives ou complexes est prsente  la n de ce cours et en
Premire partie
prsente en fait l'aboutissement.
Les chapitres de ce support de cours ne suivent pas ncessairement l'ordre de leur
prsentation dans orale le cours. Ce polycopi est plutt un manuel de rfrence qui aidera
Connaissances de base
l'utilisateur  se remettre rapidement en mmoire les principales commandes et concepts
d'Unix. L'exhaustivit (impossible de toute fa'on) n'a pas t recherche. Une lecture du
manuel en ligne (commande man ) est indispensable pour conna tre toutes les commandes
et options de la dernire version installe. Mais cette aide en ligne est crite en anglais
et les informations essentielles sont souvent noyes dans les trs nombreuses options et
commandes, et les exemples sont trop souvent absents.
Ce cours n'aborde ni l'administration d'un systme Unix ni la programmation systme,
mme s'il donne quelques rudiments d'information concernant ces deux thmes.
Il ne suppose aucune connaissance en informatique si ce n'est quelques notions lmen-
taires sur l'architecture des ordinateurs et sur la programmation.
Un autre polycopi rassemble les notions et commandes lies  l'utilisation des rseaux
informatiques. Ces deux cours devront tre complts par quelques connaissances de base
de l'interface graphique X Window, en particulier les notions de gestionnaire de fentres
et de ressources.
Le lecteur interess par l'implmentation des dirents Unix pourra consulter le livre
Unix Internals crit par Uresh Vahalia, ditions Prentice Hall (disponible  la bibliothque
de l'universit de Nice).
Les remarques et les corrections d'erreurs peuvent tre envoyes par courrier lectro-
nique  l'adresse grin@unice.fr, en prcisant le sujet Poly Unix et programmation du
shell et la date de la version du polycopi.
Chapitre 1
Gnralits sur Unix
1.1 Systmes d'exploitation
Unix est un systme d'exploitation.
Un systme d'exploitation est un logiciel qui fournit un environnement d'excutio
pour les programmes qui vont s'excuter sur l'ordinateur. Il doit grer en particulier le
ressources que vont se partager les programmes. Il a, entre autres, la charge des fonction
suivantes, essentielles pour la bonne marche d'un ordinateur :
) gestion du processeur
) gestion de la mmoire centrale
) gestion du systme de chiers
) gestion des priphriques
Un ordinateur ne peut fonctionner sans systme d'exploitation. Un ordinateur donn
peut fonctionner avec plusieurs systmes d'exploitation * par exemple, certains PC pe
mettent  l'utilisateur de travailler sous Unix ou sous Windows 95 ou NT.

1.2 Historique
1969 Ken Thompson crit Unix en assembleur dans les laboratoires de Bell (AT&T).
1973 Dennis Ritchie et Ken Thompson rcrivent Unix en langage C (seulement 10 % e
assembleur).
1974 Unix est distribu aux universits amricaines.
1975 Premire version d'Unix commercialise (licence pour le code source * version 6).
1977 Unix BSD (Berkeley Software Development) 1.0 de l'universit de Berkeley au
!tats)Unis.
4 CHAPITRE 1. GNRALITS SUR UNIX 1.5. STRUCTURE D'UNIX
1979 Unix Version 7. Commercialisation d'une licence binaire (moins onreuse que la SHELLSCRIPTS APPLICATIONS
licence pour le code source).
1984 Unix Systme V SHELL

1991 Unix OSF/1 NOYAU UNIX

MATERIEL

1.3 Standards et versions d'Unix


Fig. 1.1 ) Structure d'Unix
Unix est un systme ouvert : il n'est pas li  un constructeur d'ordinateur ou  une
socit d'dition de logiciels * AT&T a largement dius le code source d'Unix dans les ) portable,
universits  ses dbuts et de multiples Unix ont t dvelopps par des socits direntes.
Tous les grands constructeurs ont leur Unix, rcrit entirement par eux (Unix-like) ou ) dont les systme de chiers sont hirarchiss en arbre,
dvelopp  partir d'une licence achete  AT&T (Unix-based). Tous ces Unix respectent
un minimum de normes et il n'est pas trop dicile de porter une application d'un Unix ) qui ore une compatibilit totale des entres-sorties (pour Unix, les priphrique
vers l'autre. sont des chiers * voir 1.6.2),
Les direntes versions d'Unix taient issues de Systme V de AT&T ou de Unix BSD ) pour lequel il est trs facile d'ajouter de nouvelles commandes sans modi er le noya
de l'universit de Berkeley. Au dbut des annes 1990, Open Software Fondation (OSF) a (gr&ce  la grande puissance des langages des shells).
dvelopp un nouvel Unix : OSF/1.
Le systme Solaris actuellement utilis sur de nombreux ordinateurs de l'universit de
Nice est issu de Unix Systme V.
La plupart des commandes que vous utiliserez en tant qu'utilisateur ordinaire ou dve-
1.5 Structure d'Unix
loppeur d'applications sont les mmes dans toutes les versions d'Unix. Les dirences les
plus sensibles se trouvent au niveau de l'administration du systme.
1.5.1 Noyau
La tendance actuelle est au rapprochement des direntes versions d'Unix, au moins au Le noyau est la partie centrale d'Unix. Il se charge des t&ches essentielles pour la bonn
niveau de l'utilisateur et du dveloppeur, autour de normes d nies par des groupements marche du systme : gestion du systme des chiers, gestion du processeur et de la mmoir
d'utilisateurs, des constructeurs d'ordinateurs ou des diteurs de logiciels. Ces normes centrale. Les drivers de priphriques sont intgrs au noyau. Ils grent les changes (le
spci ent des interfaces : elles d nissent les signatures et smantiques (mais pas les im- entres-sorties) entre l'unit centrale et les priphriques.
plmentations) des fonctions qui constituent ces interfaces. Les trois normes principales Le noyau met  la disposition des autres programmes des procdures appeles primitive
sont SVID (System V Interface De nition), POSIX (Portable Operating System based on Les autres programmes peuvent inclure dans leur code des appels systme qui lancen
unIX) de l'IEEE et CAE (Common Applications Environment) de X/Open. l'excution de ces primitives. Les primitives permettent de lancer de nouveaux processu
de lire ou d'crire sur des chiers, d'obtenir plus de place en mmoire centrale, etc... Ce
appels systme sont rpertoris dans la section 2 du manuel en ligne (voir 3.5).
1.4 Proprits d'Unix Ce fonctionnement par primitives permet en particulier de rsoudre les problmes d'ac
cs concurrent aux informations du systme (sur un systme mono-processeur). En ee
Unix est un systme d'exploitation les appels systme font entrer l'excution en mode noyau. Dans ce mode le processus es
assur de garder le processeur jusqu'au retour au mode utilisateur quand l'appel systm
) d'usage gnral, est termin.
) multi-utilisateurs, multi-t&ches,
1.5.2 Shell
) interactif,
Le shell est l'interprteur de commandes. Quand un utilisateur tape des commande
) orient temps partag, Unix, ces commandes sont lues par le shell qui eectue ventuellement des traitement
6 CHAPITRE 1. GNRALITS SUR UNIX 1.6. ORGANISATION DES SYSTMES DE FICHIERS
avant de lancer l'excution de la commande. Le shell est une couche logicielle bien spare /
du noyau. Il existe plusieurs shells dont les plus utiliss sont :
) le Bourne shell sh , le shell standard d'Unix AT&T,
) le C-shell csh , le shell d'Unix BSD * sa syntaxe rappelle le langage C,
dev etc usr students bin tmp
) le Korn-shell ksh est une extension du Bourne shell. Il possde toutes les commandes
du Bourne shell (et il se comporte presque exactement comme lui pour ces com- Commandes
mandes) et il comprend aussi d'autres commandes et fonctionnalits qui facilitent le Fichiers spéciaux
travail de l'utilisateur comme, par exemple, la gestion de l'historique des commandes (périphériques) classe1 classe2
tapes par l'utilisateur, qui existe aussi dans le C-shell. On le trouve maintenant dans
la plupart des distributions Unix. Commandes et fichiers
système bibi
) le Z shell zsh est une extension du Korn-shell. Il ore en particulier la compltion et
la correction de commande : l'utilisateur peut lui demander de complter un nom de
commande et il propose des corrections  l'utilisateur lorsque la commande comporte bin ucb local lib
une erreur, par exemple lorsqu'une commande a t mal orthographie.
Certaines commandes  la disposition de l'utilisateur, sont programmes dans le shell Commandes Commandes
et celui-ci peut donc les excuter directement. Elles sont peu nombreuses * on trouve par emacs
exemple les commandes cd ou pwd. On les appelle les commandes internes au shell. Les bin lib
toto
autres commandes sont des commandes externes au shell. Pour les excuter le shell lance
un programme qui correspond  un chier excutable situ dans l'arborescence des chiers. Commandes
Le shell possde un vritable langage avec des structures de programmation (alterna-
tives, rptitions,...) et l'utilisateur peut crire ses propres commandes dans ce langage (le bin Fichiers de
programme s'appelle un shellscript). Une fois crites, ces nouvelles commandes peuvent l’étudiant toto
tre utilises exactement comme les commandes classiques d'Unix. Commandes de
Le shell que nous utiliserons est zsh. l’étudiant toto

Fig. 1.2 ) Arborescence des chiers


1.6 Organisation des systmes de chiers
Des utilitaires de rseaux (comme NFS) permettent mme de voir des systmes implant
1.6.1 Syst
me de chiers sur des machines direntes comme s'ils appartenaient  une mme arborescence.
L'arborescence totale ressemble  l'arborescence de la gure 1.2.
Les chiers d'Unix sont enregistrs dans un ensemble structur hirarchiquement en
arbre, appel systme de chiers. Un systme de chiers est compos d'une racine et de
noeuds qui sont des chiers rpertoires (ces chiers contiennent des rfrences  d'autres 1.6.2 Types de chiers
chiers), et de chiers ordinaires qui contiennent des donnes et des programmes. Unix utilise les types de chiers suivants :
En gnral, plusieurs systmes de chiers sont  monts sur le systme racine, c'est
 dire celui qui contient le rpertoire / (voir commande df en 6.7.2). Ces systmes sont chiers ordinaires : ils contiennent les donnes ou les programmes. Ils n'ont aucun
enregistrs sur des disques physiques dirents ou sur un mme disque mais sur des parti- structure particulire : ils sont considrs comme une suite d'octets. Il n'y a pa
tions direntes (un disque physique peut tre divis en plusieurs disques logiques appels de notion d'enregistrement ni d'accs par index. Si on veut un squentiel index, o
partitions). Tous ces systmes de chiers sont vus par l'utilisateur comme un seul systme. le programme (ou on l'achte dans le commerce) !
8 CHAPITRE 1. GNRALITS SUR UNIX
On peut cependant distinguer trois grands types de chiers ordinaires :
) les chiers binaires excutables, crits dans le code du processeur de la machine,
qui ont une structure particulire reconnue par le noyau Unix.
) les chiers de textes qui sont structurs en lignes.
En Unix, le caractre de n de ligne est par convention le caractre de code
ASCII 10 ( linefeed  en anglais).
Chapitre 2
On remarquera que ce n'est pas le mme caractre que celui utilis par les
systmes d'exploitation MS-DOS (sur PC) ou Mac-OS (sur Macintosh), ce qui
oblige  eectuer un traitement minimum pour transfrer des chiers de textes Acteurs/objets du monde Unix
entre ces systmes.
) les autres chiers qui n'ont pas de structure particulire pour Unix (mais peuvent
avoir une structure particulire adapte au logiciel qui les a crs). Ce chapitre expose quelques notions et concepts de base sur le fonctionnement d'Unix
rpertoires : ils sont les noeuds de la structure arborescente des chiers. Ils contiennent les Les commandes associes  ces notions seront tudies dans les chapitres suivants.
identi cateurs (i-nodes) d'autres chiers. Ils correspondent  des sous-bibliothques Les acteurs/objets principaux que l'on rencontre en Unix sont les utilisateurs, les pro
ou dossiers qui contiennent d'autres chiers. cessus et les chiers.
chiers spciaux : ils sont lis  un priphrique (/dev/tty01 est par exemple li  un
terminal) * ils correspondent  des programmes (pilotes * drivers en anglais) qui grent 2.1 Utilisateurs
les changes avec les priphriques : disques, terminaux, imprimantes, streamers, lec-
teurs de bandes, etc. 2.1.1 Un utilisateur dans le syst
me
liens symboliques : ils contiennent le nom d'un autre chier et permettent des indirec- Nom, mot de passe, uid
tions.
Un utilisateur est repr par son nom qu'il doit taper au moment de l'entre dans
sockets : ils sont utiliss pour les liaisons inter-processus * ils ne seront pas tudis ici. systme.
Unix Systme V utilise aussi les  pipes nomms qui sont utiliss pour la communication Chaque nom correspond  un numro d'utilisateur (un nombre entier) : le uid (use
entre les processus. Ils ne seront pas tudis ici. identier ). Plusieurs utilisateurs peuvent avoir un mme uid mais cette possibilit n'es
utilise que pour quelques pseudo-utilisateurs du systme qui ont par exemple besoin de
autorisations du super-utilisateur (voir 2.1.2) pour accomplir une t&che bien d nie.
Un utilisateur s'authenti e lors de son entre dans le systme gr&ce  son mot de pass

Groupes d'un utilisateur


Un utilisateur appartient  un groupe d'utilisateurs dont le numro est enregistr dan
la ligne rserve  cet utilisateur dans le chier /etc/passwd (ou dans les chiers systm
qui jouent un rle quivalents * voir ci-dessous page 10 la section sur les chiers systme)
La notion de groupe permet  plusieurs utilisateurs de partager certains droits pou
l'utilisation des chiers appartenant au groupe (voir 2.4 et 2.3.3).
La plupart des Unix modernes permettent  un utilisateur d'appartenir  plusieur
groupes en plus de son groupe principal (celui qui est enregistr dans le chier des mot
de passe).
10 CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 2.2. PROCESSUS 1
Les groupes ne sont pas grs de la mme fa'on par les dirents types d'Unix. Nous 2.1.2 Super-utilisateurs
n'tudierons pas cette notion en dtails dans ce cours. Les utilisateurs de uid 0 sont appels des super-utilisateurs. Ces utilisateurs ont de
droits que les autres utilisateurs n'ont pas. Ils peuvent, par exemple, changer le mot d
Rpertoire HOME passe des autres utilisateurs et changer les autorisations ou le propritaire de n'import
quel chier de l'arborescence.
Un utilisateur possde un rpertoire HOME dans lequel il est positionn lorsqu'il entre
dans le systme. Ce rpertoire est choisi par l'administrateur en fonction de l'utilisateur. 2.1.3 Administrateur du syst
me
En gnral, le nom terminal de ce rpertoire est le nom de l'utilisateur et il est plac dans
un rpertoire rserv  sa fonction dans l'institution. Par exemple, l'tudiant jean en Un systme Unix doit tre gr par un administrateur qui est responsable du bo
deuxime anne d'informatique aura le rpertoire HOME  /students/info2/jean. fonctionnement du systme. Voici quelques unes de ses t&ches :
) enregistrer les nouveaux utilisateurs et crer leur environnement de travail,
Programme de dmarrage ) installer les nouvelles versions des logiciels,
L'administrateur attribue  chaque utilisateur un programme de dmarrage qui sera
excut quand l'utilisateur entrera dans le systme. Pour vous, c'est le shell zsh. ) reprer les problmes qui empchent le systme de fonctionner correctement,
) nettoyer priodiquement le disque des chiers non utiliss,
Attributs d'un utilisateur ) eectuer rgulirement des sauvegardes des donnes et des programmes.
En rsum,  chaque utilisateur est associ : Pour beaucoup des t&ches qu'il doit accomplir, l'administreur doit entrer dans le systm
comme super-utilisateur.
) un nom,
) un mot de passe, 2.2 Processus
L'unit d'excution est le processus. Toute action est excute par un processus. Tous le
) un uid, Unix modernes orent une unit plus lgre appele  thread  qui permet  un processus d
faire excuter une t&che par plusieurs sous-t&ches qui s'excutent en parallle et partagen
) un ou plusieurs groupes, le mme espace mmoire. Nous ne les tudierons pas dans ce cours.
Chaque processus est identi  par le systme par un numro de processus (pid * proces
) un rpertoire HOME, identier ).
Une commande tape par l'utilisateur peut engendrer un ou plusieurs processus, o
) un programme de dmarrage. n'engendrer aucun nouveau processus si la commande est interne au shell.
Unix est multi-t&che. Tous les processus en cours d'excution se partagent le processeur
de la machine. Chaque processus re'oit l'usage du processeur pendant un laps de temp
Fichiers systme assez court (environ un centime de seconde) pour que l'utilisateur ne s'aper'oivent pa
Les informations sur un utilisateur sont enregistres dans le chier /etc/passwd. Pour de la prsence des autres processus pendant les priodes d'interaction avec le programm
des raisons de scurit ou de commodit (pour grer un rseau de machines), l'administra- (entres-sorties avec le clavier ou avec la souris).
teur peut ajouter des utilitaires de gestion du systme (Yellow pages ou NIS, Kerberos, Un processus travaille dans son propre environnement (en particulier avec ses propre
etc.). Dans ce cas, le chier /etc/passwd peut ne pas contenir toutes les informations variables). A un moment donn, son environnement est reprsent par une image qui es
concernant les utilisateurs (par exemple, les mots de passe sont remplacs par *) ou une sorte de clich (au sens photographique) du processus.
mme aucune information sur certains utilisateurs (ces informations ne sont enregistres 1. mme si la machine est a plusieurs processeurs, ceux-ci sont habituellement bien moins nombreu
que sur certaines machines du rseau * voir en particulier 6.6). que les processus
12 CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 2.2. PROCESSUS 1
L'image d'un processus est compose de : 1 HUP(hangup ) envoy  ses processus quand on sort de la session de travail ou
quand se dconnecte par un modem
) son code 2 INT envoy au processus en avant-plan dans le terminal dans lequel la touche
d'interruption a t tape (voir 3.3 et 3.7.1)
) les donnes associes (traites par le code) 3 QUIT comme INT, mais cre souvent un chier core
9 KILL signal qui ne peut tre intercept (voir commande trap en 17.5) et qui va
donc tuer  coup s.r le processus qui le re'oit
) les chiers ouverts et leur tat 15 TERM (terminate ) envoy par dfaut par la commande kill (voir 7.2). Pour
terminer un processus d'une manire lgante si possible
) le rpertoire courant 18 TSTP suspend un processus (touche Ctrl Z)
19 CONT pour continuer aprs une suspension
) les informations du systme sur le processus (propritaire, terminal associ, etc.)
2.2.2 Terminal de contrle d'un processus, excution en arri
re
On remarquera en particulier qu' un moment donn de son excution un processus a plan
un rpertoire courant o- il est situ.
Tout le code du programme n'est pas ncessairement en mmoire durant l'excution. Les processus lancs par un utilisateur restent lis au terminal d'o- ils ont t lanc
Le code est dcoup en pages par le systme et seules les pages ncessaires sont charges en appel terminal de contrle du processus. Le systme peut ainsi reprer les processus qu
mmoire centrale. Au cours de l'excution du programme des pages peuvent tre transpor- recevront le signal engendr par la frappe de la touche d'annulation ou les processus qu
tes du disque vers la mmoire centrale si la page n'est plus ncessaire et que le systme a seront arrts si l'utilisateur teint son terminal.
besoin de place en mmoire centrale, et faire le chemin inverse lorsque la page est ncessaire Un utilisateur peut lancer certains processus en arrire-plan (voir 14.5). Ces processu
 l'excution du programme. Ce systme de gestion de la mmoire s'appelle le  demand deviennent indpendants du terminal : ils s'excutent sans intervention de l'utilisateur e
paging . La zone du disque rserve  ces allers et retours s'appelle la zone de  swap . sans que celui-ci ait  attendre la n de leur excution. Il peut ainsi lancer plusieurs t&che
en parallle (mais sans relle synchronisation entre elles). Ces processus ne seront pa
arrts si l'utilisateur appuie sur la touche d'annulation mais ils peuvent toujours tre tu
2.2.1 Signaux envoys aux processus par la commande kill (voir 7.2). Ils ne peuvent pas lire les caractres taps sur le termina
mais ils peuvent toujours y crire.
Durant son excution, un processus peut recevoir un signal. La plupart des signaux Des processus peuvent tre lancs automatiquement par le systme, en arrire-pla
interrompent l'excution du processus mais celui-ci peut les intercepter. Il peut alors ef- (comme le systme de spool pour l'impression tudi en 8.4). Ces processus sont appe
fectuer un traitement spcial et choisir ensuite de continuer  s'excuter ou d'arrter son ls des daemons, acronyme de l'anglais  deferred auxiliary execution monitor c'est--dir
excution (voir 7.2 et 17.5). programme de contrle d'excution dire. On les appelle souvent dmons en fran'ais
Les signaux peuvent tre envoys par :
) un processus, avec la commande ou l'appel systme kill (voir 7.2), 2.2.3 Propritaires et groupes eectifs et rels d'un processus
Chaque processus a un propritaire eectif et un propritaire rel. Le propritaire r
) le noyau, engendrs par la frappe d'une touche du clavier par l'utilisateur pour in- est l'utilisateur qui a lanc la commande qui a gnr les processus. Le propritaire eect
terrompre (ou stopper momentanment) tous les processus lis au terminal (notion dtermine les droits du processus dans le systme et en particulier les actions autorise
tudie en 2.2.2), sur les chiers (voir 2.4).
Le plus souvent le propritaire eectif est le propritaire rel. Il existe une exceptio
) le noyau, engendrs par des erreurs venant du matriel ou du logiciel. importante lie  la notion de  set user id tudie en 2.4.2.
De mme, chaque processus a un groupe rel (le groupe de l'utilisateur qui a lanc l
Voici quelques numros, noms et descriptions de signaux utiles  conna tre (on les trouve commande qui a gnr les processus) et un groupe eectif (voir 2.4.2). Nous n'tudieron
dans le chier /usr/include/signal.h) : pas ces notions en dtails dans ce cours.
14 CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 2.4. PROTECTION DES FICHIERS 1
2.2.4 Cration d'un nouveau processus, arbre des processus 2.3.3 Propritaire et groupe d'un chier
Chaque processus (sauf le processus de pid 1) est cr par son processus parent. On a Au moment de sa cration, le propritaire d'un chier est l'utilisateur qui l'a cr. Seu
ainsi un arbre gnalogique des processus crs dans une session. Les pid ainsi que les pid un super-utilisateur (voir 2.1.2) peut changer le propritaire d'un chier.
des parents de tous les processus sont achs par la commande ps. Un chier a aussi un groupe qui est le nom d'un groupe d'utilisateur. C'est le plu
souvent le groupe de l'utilisateur qui a cr le chier. Cette notion de groupe facilite
partage de chiers entre plusieurs utilisateurs. Nous n'tudierons pas cette notion en dtai
2.3 Fichiers dans ce cours.
Les donnes (que l'on veut conserver entre deux sessions) et les programmes sont enre-
gistrs dans des chiers. 2.3.4 Mode d'acc
s au chier
On a vu en 1.6 que Unix utilise aussi la notion de chier pour organiser l'ensemble des A chaque chier sont attaches les autorisations pour le propritaire du chier, pou
chiers (rpertoires) et pour travailler avec les priphriques ( chiers spciaux). les membres du groupe du chier (mais sans le propritaire), pour les autres (le rest
du monde, ceux qui ne sont pas le propritaire et qui n'appartiennent pas au groupe d
chier). Ces autorisations forment le mode d'accs au chier. Elles sont aches par l
2.3.1 i-node commande  ls -l (voir gure 4.2 et section 4.2) juste aprs le type du chier.
Outre le contenu du chier, le systme conserve d'autres informations (par exemple le Les autorisations peuvent tre (leur signi cation exacte sera tudie en 2.4.1) :
propritaire) sur chacun des chiers de l'arborescence.
Ces informations lui seront utiles pour la gestion et la scurit du systme. Ces infor- ) l'autorisation de lecture (r pour la commande  ls -l )
mations ne sont pas enregistres avec le contenu du chier, elles sont enregistres dans la
table des i-nodes (une table pour chaque systme de chiers) qui est conserve dans un ) l'autorisation d'criture (w pour la commande  ls -l )
endroit spcial sur le disque. Chaque chier a un numro de i-node (un nombre entier) qui
indique dans quelle entre de la table des i-nodes les informations systme le concernant ) l'autorisation d'excution (x pour la commande  ls -l )
sont ranges.
Il existe aussi des autorisations spciales rserves  certains chiers excutables (elle
accordent des droits spciaux aux processus qui excutent ces chiers * elles sont tudie
2.3.2 Structure interne des rpertoires en dtail en 2.4.2) :
La liaison entre les noms des chiers et les informations enregistres dans le i-node du ) set user id * suid en abrg (s  la place du x dans les autorisations du propritair
chier se fait gr&ce aux rpertoires. pour la commande  ls -l)
Les rpertoires sont des chiers de l'arborescence mais leur contenu dire des chiers
ordinaires. Un chier rpertoire contient le nom et le numro de i-node des chiers placs ) set group id * sgid en abrg (s  la place du x dans les autorisations du group
directement sous ce rpertoire dans l'arborescence des chiers. pour la commande  ls -l)
Les informations concernant un chier sont donc conserves dans trois endroits di-
rents :
) le nom du chier est conserv dans le rpertoire contenant le chier,
2.4 Protection des chiers
La protection des chiers en Unix est fonde sur les droits des processus sur les chier
) les informations systme sont conserves dans le i-node du chier, (rappelons que le processus est l'unit lmentaire d'excution en Unix). Un processus n'es
pas autoris  faire n'importe quelle action sur les chiers. Par exemple, il peut avoir
) le contenu du chier (les donnes) est enregistr dans les blocs du disque dont les droit de lire le contenu d'un chier mais pas de supprimer ce chier. Nous allons examine
adresses sont dans le i-node. dans cette section comment sont dtermins les droits d'un processus sur un chier.
16 CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 2.4. PROTECTION DES FICHIERS 1
2.4.1 Droits associs aux autorisations 2.4.3 Mcanisme de protection des chiers
Les autorisations qui constituent le mode d'accs au chier ne d nissent pas toujours On a vu en 2.4.1 les actions qu'un processus a le droit d'eectuer sur un chier * elle
d'une fa'on vidente les actions qu'un processus a le droit d'excuter sur le chier. Par dpendent des autorisations que ce processus a sur le chier lui-mme et sur les rpertoire
exemple, un processus peut avoir le droit de supprimer un chier sans avoir l'autorisation parents de ce chier. Voici les rgles qui dterminent les autorisations d'un processus su
w sur ce chier. On peut aussi s'interroger sur la signi cation de l'autorisation x pour un chier :
un rpertoire.
L'autorisation de lecture correspond au droit de lire le contenu du chier, l'autorisation ) si le propritaire eectif du processus et le propritaire du chier sont les mmes, le
d'criture correspond au droit d'crire dans le chier, l'autorisation d'excution correspond autorisations du processus sont les autorisations du chier accordes au propritair
au droit d'excution du chier si le chier n'est pas un rpertoire et au droit de travailler ) sinon, si le groupe du chier est le groupe eectif du processus ou l'un des groupe
dans son arborescence si le chier est un rpertoire. de l'utilisateur chier, les autorisations du processus sont les autorisations du chie
Pratiquement, on a le tableau suivant : accordes au groupe,
Type de Fichier Fichier ordinaire Rpertoire
Autorisation ) sinon, les autorisations du processus seront celles accordes aux autres.
Lecture r lire le contenu du chier lister les sous- chiers
Ecriture w modi er le contenu du chier ajouter, enlever des sous-
chiers
Excution x excuter le chier travailler dans le rpertoire
Pour mieux comprendre le tableau ci-dessus il est bon de se rappeler la structure interne
d'un rpertoire (voir 2.3.2). Ainsi, on comprend que, si on veut supprimer un chier d'un
rpertoire, il faut et il sut d'avoir l'autorisation d'crire dans le rpertoire (pour eacer
l'entre correspondant au chier dans le rpertoire).
Donc, si l'on veut protger un chier sans interdire l'accs au rpertoire dans lequel il
est situ, il faut enlever l'autorisation d'criture dans le rpertoire parent pour interdire
la suppression de ce chier et enlever l'autorisation d'criture sur le chier lui-mme pour
interdire la modi cation du chier.

2.4.2 Autorisations set user id et set group id


Les droits d'un processus sur un chier dpendent du propritaire et du groupe eectifs
d'un processus et pas du propritaire et du groupe rels.
Habituellement le propritaire et le groupe eectifs sont le propritaire et le groupe rels
(l'utilisateur qui a lanc le processus, et son groupe). Cependant, si le code excut par
un processus est celui d'un chier binaire qui a le bit  set user id (resp.  group user id)
positionn, le propritaire eectif (resp. le groupe eectif) du processus est le propritaire
(resp. le groupe) du chier binaire.
Ce fait est par exemple utilis par la commande passwd pour permettre  un simple
utilisateur de changer son mot de passe dans des chiers qu'il n'est pas normalement
autoris  modi er : seul le super-utilisateur root a le droit de modi er le chier des mots
de passe mais la commande passwd a l'autorisation set user id et appartient  root. Le
simple utilisateur a donc tous les droits de root le temps qu'il excute la commande passwd
(qui ne lui permet de modi er que son propre mot de passe). Il rcupre ses droits de
simple utilisateur ds la n de l'excution de la commande passwd.
18 CHAPITRE 3. PREMIERS PAS DANS LE SYSTME 3.2. SORTIE DU SYSTME 1
Dans un mot de passe on peut utiliser tous les caractres sauf # et @. Dans les compa
raisons pour tester si un mot de passe est valable, les majuscules et les minuscules ne son
pas quivalentes.
Pour des raisons de scurit, l'administrateur peut imposer la modi cation du mot d
passe  intervalles rguliers.
Chapitre 3 3.1.2 Dmarrage d'une session
Premiers pas dans le systme Aprs que l'utilisateur ait entr son nom et son mot de passe, certaines actions son
automatiquement eectues par Unix :
- le shell de dmarrage est lanc (le plus souvent zsh pour les tudiants de l'universit
de Nice),
Ce chapitre donne quelques informations utiles pour commencer  travailler dans un
systme Unix. Certaines notions voques sont dveloppes dans la suite du cours (par - le rpertoire HOME devient le rpertoire courant,
exemple, les chiers de con guration du shell). - des chiers d'initialisation sont automatiquement lancs. Ils initialisent l'environne
ment de l'utilisateur. Ils donnent en particulier des valeurs initiales aux variable
3.1 Entre dans le systme TERM (nom du type de terminal, le plus souvent xterm si on travaille sous X
Window) et PATH (voir 3.7.2). Ces chiers sont tudis plus en dtails en 15.3.
Lorsqu'un terminal est allum, certains processus sont automatiquement lancs par le Remarque 3.2
systme pour grer les entres et les sorties depuis ce terminal. En particulier, un processus Si on travaille sous X Window, une variable importante est DISPLAY qui indiqu
est lanc pour attendre l'entre d'un nom d'utilisateur et d'un mot de passe. aux clients X (programmes qui utilisent le systme graphique X Window) avec qu
Le nom d'utilisateur est attribu par l'administrateur du systme. terminal clavier-cran-souris ils doivent travailler.
3.1.1 Changer son mot de passe (passwd) 3.2 Sortie du systme
Par prudence, l'utilisateur doit changer le mot de passe que l'administrateur lui a
attribu lorsqu'il entre pour la premire fois dans le systme. La commande exit permet de sortir d'un shell. S'il s'agit du shell de connexion, l
passwd session de travail se termine.
permet d'entrer un nouveau mot de passe.
Remarque 3.1
Sur les systmes dont les mots de passe sont grs par le systme NIS (voir 6.6),
3.3 Touches spciales
les mots de passe (et plusieurs autres chiers utiliss par le systme) de plusieurs Quelques touches/caractres ont des signi cations spciales (Ctrl C s'obtient au clavie
machines sont centraliss sur une seule machine. La commande pour changer le mot en maintenant appuye la touche Ctrl] du clavier tout en appuyant sur la touche C) :
de passe est alors yppasswd qui a la syntaxe : Ctrl S interrompt la transmission des caractres entre le terminal et le programme e
yppasswd nom-login
cours
Ctrl Q rtablit la transmission en librant tous les caractres taps depuis un prc
L'utilisateur doit entrer l'ancien mot de passe avant de donner le nouveau. Pour viter dent Ctrl S
des fautes de frappe (impossibles  voir puisque le mot de passe ne s'ache pas  l'cran), Ctrl D est transmis comme une n de chier par le driver de terminal s'il est l'uniqu
le nouveau mot de passe doit tre entr deux fois. Seul le propritaire du mot de passe (ou caractre d'une ligne (voir 8.1).
le super utilisateur) peut entrer un nouveau mot de passe. Le mot de passe doit comporter Elle permet donc de terminer un shell  la place de la commande exit, sauf
au moins 6 caractres. l'utilisateur inhibe cette fonction pour viter des sorties involontaires en pla'an
20 CHAPITRE 3. PREMIERS PAS DANS LE SYSTME 3.5. CONSULTATION DU MANUEL EN LIGNE (MAN) 2
la commande interne  set -o ignoreeof du shell dans un chier d'initialisation 3.5 Consultation du manuel en ligne (man)
du shell (voir 15.3). Il est en eet facile de taper par erreur Ctrl] D au lieu, par
exemple, de Shift] D. La commande man permet de consulter le manuel de rfrence des commandes Unix
La touche Ctrl] D permet aussi d'eacer le caractre sur lequel se trouve le man -s numro-section ] commande
curseur quand on modi e une ligne de commande. ache les pages du manuel de rfrence sur la commande et dans la section indique. Su
Ctrl C interrompt l'excution d'une commande certaines versions de man le numro de la section est donn seul, sans tre prcd d
Ctrl U eace la ligne de commande en cours d'criture l'option  -s. 1 est le numro de section par dfaut.
Les quatre 0ches permettent de rappeler les commandes dj tapes et de se dplacer Les direntes sections sont les suivantes (sur un Unix Solaris * on peut trouver de
dans ces commandes pour les modi er (tout caractre tap s'insre dans la commande). variantes sur les dirents Unix) :
1. commandes pour l'utilisateur (ls, sort, etc.),
3.4 Format des commandes Unix 2. appels systme (pour les programmeurs en langage C),
Une grande partie des commandes Unix ont t crites  l'origine par des utilisateurs
et ont t intgres dans le lot des commandes standards. Dans un premier temps, aucune 3. fonctions diverses de direntes librairies (pour les programmeurs en langage C),
syntaxe standard n'avait t clairement choisie pour le format des options des commandes.
Une consquence f&cheuse est que certaines options qui se correspondent dans des com- 4. information sur les formats de chiers (passwd, group, etc.),
mandes direntes, peuvent avoir des noms et des syntaxes direntes. Par exemple, pour 5. informations diverses,
dsigner un sparateur de champ, la commande  sort utilise -d alors que la commande
 cut utilise -t. 6. jeux et dmonstrations,
La syntaxe gnrale des commandes Unix est :
commande options... arguments... Les informations pour l'administration du systme sont donnes dans la section 1M.
Les arguments indiquent les objets sur lesquels la commande va agir et les options Chaque section a une entre particulire intro qui la dcrit et donne quelques info
indiquent des variantes dans l'excution de la commande. mations gnrales.
Les options sont le plus souvent prcdes d'un tiret -. L'ordre des options est le plus
souvent indirent et plusieurs options peuvent tre regroupes derrire un seul tiret. Exemples 3.3
Les arguments peuvent tre absents et, dans ce cas, prennent des valeurs par dfaut. (a) man man
Exemples 3.1 (b) man ls
(a) date
(c) man -s 2 intro (ou man 2 intro suivant les Unix)
(b) ls -la
man -k mot-cl
(c) ls -l /users/students ache une ligne sur chaque entre (en gnral le nom d'une commande Unix) du manu
qui contient mot-cl dans la section NAME (qui comporte une description succincte d
(d) ls /users/students la commande) du manuel.
Dans les manuels de rfrence, Remarque 3.3
 ] indique les options ou les arguments facultatifs, Pour que cette option fonctionne, l'administrateur doit eectuer une indexation pra
 arg... indique que l'argument arg peut tre rpt. lable des noms de commandes qui sont rpertories dans le manuel.
Exemple 3.2 Exemple 3.4
ls -abcCdfFgilmnopqrRstux] files...] man -k directory
22 CHAPITRE 3. PREMIERS PAS DANS LE SYSTME 3.7. COMMANDES 2
3.6 Nom d'un chier, nom absolu, nom relatif peuvent tre appeles par leur nom terminal. Il n'est pas ncessaire de taper leur nom
absolu ou relatif.
Le nom terminal est compos d'au plus 14 caractres si l'on veut rester compatible On peut par exemple taper 'man' au lieu de '/bin/man' parce que le rpertoire /bi
avec toutes les versions d'Unix systme V (jusqu' 255 caractres dans toutes les versions fait partie de la liste de rpertoires de la variable PATH.
rcentes d'Unix). Tous les caractres du code ASCII sont autoriss sauf / et le caractre On peut acher la valeur de PATH avec la commande (en gnral la liste est plu
de code 0. longue que la rponse donne ici *  (~) est le prompt) :
Le nom (ou chemin) absolu est compos du nom terminal prcd du chemin d'accs (~) echo $PATH
 ce chier depuis la racine. Par exemple, /users/students/jean/ache Le premier / /bin:/usr/bin:/users/students/toto/bin:/usr/ucb:.
dsigne le rpertoire racine. Les / suivants servent de sparateurs entre les noms des La valeur est une suite de noms de rpertoires spars par :. Le rpertoire courant peu
rpertoires et le nom terminal. tre indiqu par un ., ou par : au dbut ou  la n de la liste.
Ce nom absolu est souvent lourd  manier car il peut tre trs long. Un chier peut tre Pour des raisons de scurit, il n'est pas conseill de mettre le rpertoire courant a
dsign par son nom (ou chemin) relatif qui correspond  la position du chier relativement dbut de la liste. En eet, la liste est parcourue de gauche  droite pour rechercher un
au rpertoire courant o- se trouve le processus qui dsigne le chier (voir 2.2). Un nom est commande et on n'est pas certain de ne pas avoir par exemple un chier ls pig dan
relatif quand il ne commence pas par un /. le rpertoire courant, lorsque l'on se dplace dans l'arborescence et que l'on lance cett
commande.
Exemple 3.5 Cette variable est initialise par l'administrateur du systme au moment de la cratio
Si l'utilisateur (plus prcisment le processus qui excute le shell courant de l'utilisa- de l'utilisateur. L'utilisateur peut ensuite modi er sa valeur. Le plus souvent cette valeu
teur) se trouve dans le rpertoire /users/students/jean, il pourra dsigner le chier est donne dans le chier .zshenv si on travaille avec zsh (voir 15.3).
de l'exemple ci-dessus par ache. S'il se trouve dans le rpertoire /users/students,
il pourra dsigner ce chier par jean/ache. Remarque 3.4
La variable PATH n'est utilise pour rechercher une commande que si le nom de l
Noms relatifs particuliers : commande ne comporte aucun /. Si vous tapez  bin/cmd, la commande ne ser
. dsigne le rpertoire courant (o- l'on se trouve) recherche que dans le rpertoire bin situ sous le rpertoire courant et pas sou
.. dsigne le rpertoire parent du rpertoire courant tous les rpertoires bin de tous les rpertoires lists dans la variable PATH. Tape
 ./cmd est un bon moyen d'excuter une commande de son rpertoire courant, alor
que  cmd risque d'excuter un autre  cmd situ dans un des rpertoires de la variab
3.7 Commandes PATH.
3.7.1 Lancer une commande, supprimer un processus 3.7.3 Nom complet et type d'une commande (whence, whereis)
Lorsqu'il a la main (le prompt est ach) l'utilisateur peut lancer une commande en Comme on vient de le voir, la facilit oerte par la variable PATH provoque parfois de
tapant son nom suivi ventuellement de ses options et de ses arguments. problmes. Sous ksh et zsh (mais pas sous sh ), la commande whence permet de savoir o
La plupart des commandes peuvent s'interrompre en tapant sur la touche d'annulation. se situera la commande excute :
Cette touche est le plus souvent Ctrl] C ou la touche DEL]. whence -vp] commande
Certaines commandes peuvent se protger contre une interruption par la touche d'annu- indique comment serait interprte la commande si elle tait tape : fonction, command
lation. Dans ce cas, on peut tout de mme les interrompre par la commande kill (voir 7.2). interne du shell, alias ou chemin absolu pour un chier situ dans un des rpertoires de l
Un processus lanc en arrire-plan est automatiquement protg d'une interruption par variable PATH.
la touche d'annulation et la seule fa'on de l'interrompre est d'utiliser la commande kill. -v est l'option verbeuse un peu plus bavarde. Avec l'option -p, on demande de n
rechercher que les chiers excutables (et pas les fonctions, commandes internes ou alias
3.7.2 Nom d'une commande, variable PATH Certaines commandes peuvent se retrouver  plusieurs endroits de l'arborescence. C
sont souvent des versions direntes. On peut par exemple avoir les versions Unix BSD
Pour faciliter le travail de l'utilisateur, les commandes qui sont situes dans la liste et Unix OSF d'une commande. Pour retrouver toutes les versions qui se trouvent  de
des rpertoires enregistre dans la variable PATH (attention, le nom est en majuscules) emplacements standards de l'arborescence, on dispose de la commande whereis . Cett
24 CHAPITRE 3. PREMIERS PAS DANS LE SYSTME 2
commande donne aussi les emplacements de pages du manuel en ligne et des sources des
programmes.

3.7.4 Compltion des commandes par zsh


Avec zsh, l'utilisateur peut utiliser la touche Tab] pour complter les noms de com-
mandes ou les noms de chiers.
S'il y a plusieurs possibilits, zsh complte avec le plus de caractres qu'il peut et envoie
un beep sonore. L'utilisateur peut avoir les direntes possibilits en tapant Ctrl D.
S'il ne peut complter, il envoie un beep sonore.
Pour entrer une tabulation dans une commande, l'utilisateur doit la faire prcder de
Ctrl V.

Deuxime partie
Commandes
2

Chapitre 4
Commandes lies  l'arborescence des

chiers
4.1 Visualisation de l'arborescence (ls)
ls options...] fichiers...]
donne des informations pour chaque chier spci  (pour le rpertoire en cours si aucu
chier n'est spci ). Le type d'information donn dpend du type du chier :
) si le chier cit est un rpertoire, ls ache des renseignements sur les chiers (de tou
types, pas seulement les chiers ordinaires) qui sont directement sous ce rpertoir
Sans option, seuls les noms terminaux (pas les noms absolus ou relatifs) des chier
sont donns.
) si un chier cit n'est pas un rpertoire, ls ache des renseignements sur ce chie
Le nom du chier est donn (tel qu'il a t donn dans la ligne de commande : nom
relatif ou absolu). Sans option, c'est surtout utile quand on emploie des caractre
spciaux (* ou ? par exemple, tudis en 4.5) dans la ligne de commande.
Options
-l format dtaill (voir 4.2)
-a liste aussi les noms de chiers qui commencent par un . (qui ne sont pas no
malement lists)
-A comme l'option -a mais les rpertoires . et .. ne sont pas achs
-d si l'argument est un rpertoire, liste seulement son nom (et pas les chiers qu
sont sous ce rpertoire)
-t trie par date de dernire modi cation (sinon la liste des chiers est trie pa
dfaut par ordre alphabtique), les plus rcemment modi s en premier
-i ache au dbut de la ligne le numro de i-node des chiers
-R listage rcursif des sous-rpertoires
-g ache le groupe du chier quand elle est associe  l'option -l (utile seulemen
en Unix BSD * voir remarque (a) de 4.2.1)
28 CHAPITRE 4. COMMANDES LIES  L'ARBORESCENCE DES FICHIERS 4.2. INFORMATION DTAILLE SUR LES FICHIERS (LS -L) 2
$ ls -l / nom du taille du nom du
total 20954 autorisations propriétaire fichier fichier
lrwxrwxrwx 1 root system 7 Apr 26 1995 bin -> usr/bin
drwxr-xr-x 6 root system 6144 Jan 18 07:02 dev drwxr-xr-x 15 root system 4608 Jan 19 07:02 etc
drwxr-xr-x 15 root system 4608 Jan 18 07:02 etc
lrwxrwxrwx 1 root system 7 Apr 26 1995 lib -> usr/lib type du nombre nom du date de dernière
drwxr-xr-x 2 root system 512 Feb 3 1995 mnt
fichier de liens groupe modification
drwxr-xr-x 4 root system 512 Sep 19 10:52 net
drwxr-xr-x 10 root system 2560 Jun 23 1995 sbin Fig. 4.2 ) Format de sortie d'une ligne de la commande ls -lg
drwxr-xr-x 25 root system 512 Dec 7 10:15 students
drwxrwxrwt 3 root system 5120 Jan 18 08:45 tmp
drwxr-xr-x 4 root system 512 Jan 13 1995 users
Remarques 4.1
drwxr-xr-x 22 root system 512 Dec 19 13:07 usr
(a) Les versions Unix OSF et Systme V de ls achent le nom du groupe du chie
drwxr-xr-x 20 root system 512 Apr 26 1995 var
avec l'option  -l. En Unix BSD, le groupe s'ache avec l'option  -g. Si on veu
-rwxr-xr-x 1 root bin 9246472 Jun 23 1995 vmunix
rcuprer une information dans une des colonnes il est donc prfrable d'associe
........
toujours l'option  -g  l'option  -l.
Fig. 4.1 ) Format de sortie de la commande ls -lg (b) Les dates sont aches avec l'anne, ou l'heure et la minute selon que la date es
plus ou moins rcente (six mois avant la date actuelle).
-L si un chier est un lien symbolique, cette option indique que l'on veut des ren-
seignements sur le chier point par le lien et pas sur le chier lui-mme (voir 4.2.2 Types de chiers
commande ln en 9.3)
Le type du chier est ach  l'aide du premier caractre de la ligne de description d
Exemples 4.1 chier :
(a) ls -l bin /usr/bin  chier ordinaire
d rpertoire (directory)
(b) ls -ld a* b chier spcial de type bloc (essentiellement les disques)
ache les informations sur les chiers du rpertoires courant (dont le nom commence c chier spcial de type caractre (disque, streamer, terminal, etc.)
pas par un a). L'option  -d est indispensable pour ne pas entrer dans les sous- l lien symbolique
rpertoires s'il y en a dont le nom commence par a. s socket
(c) ls -t f* | head -1 Pour les liens symboliques, le nom du chier point est donn  la suite des autre
ache le nom du chier le plus rcemment modi  parmi tous les chiers du rpertoire renseignements sur le chier :
courant, dont le nom commence par un f. lrwxrwxrwx 1 root 1200 Feb 25 20:09 fich -> fichierP
Pour les chiers spciaux, la taille n'a aucun sens * elle est remplace par le majeur e
le mineur : le majeur dsigne le pilote (le programme de gestion du priphrique * driver e
4.2 Information dtaille sur les chiers (ls -l) anglais) et le mineur dsigne le priphrique particulier gr par ce pilote :
crw-rw-rw- 1 root 39,6 Feb 25 20:09 tty01
4.2.1 Format d'achage
Un exemple de format d'achage de la commande ls -l applique  un rpertoire est 4.2.3 Mode d'acc
s au chier
donn  la gure 4.1. Une premire ligne donne le nombre de blocs de 1024 octets qu'oc-
cupent l'ensemble des chiers lists par la commande. Le format d'une ligne est dtaill Les autorisations (on dit aussi le mode d'accs au chier) du chier sont indique
dans la gure 4.2. par les neuf caractres qui suivent le type du chier. Les trois premiers caractres sont le
autorisations du propritaire du chier, les trois suivants sont les autorisations du groupe d
30 CHAPITRE 4. COMMANDES LIES  L'ARBORESCENCE DES FICHIERS 4.5. CARACTRES SPCIAUX POUR LE SHELL 3
chier et les trois derniers sont les autorisations des autres (qui ne sont pas le propritaire ? dsigne un caractre quelconque,
et qui n'appartiennent pas au groupe). c1 -c2] ou c1 c2...]
dsigne un caractre spci  par l'intrieur des crochets. Par exemple, a-z
4.2.4 Nombre de liens dsigne une lettre minuscule et AEIOUY] dsigne une voyelle majuscule.
On peut aussi dsigner un caractre quelconque qui n'est pas parmi les caractre
Pour les chiers ordinaires il s'agit du nombre de chiers ayant le mme numro de spci s entre les crochet en faisant suivre le crochet ouvrant du caractre  ^
i-node. Par exemple, sous zsh,  ^0-9] dsigne un caractre qui n'est pas un chir
Pour les rpertoires, il indique le nombre de sous-rpertoires du rpertoire (augment Attention, sous sh et ksh, il faut crire  !0-9] 1 .
de 2, car . et .. sont compts). n supprime la signi cation spciale du caractre suivant.
Exemple 4.3
4.3 Se dplacer dans l'arborescence (cd) Si l'utilisateur tape la commande
ls -l bin/A0-9]*
cd rpertoire] la commande suivante sera lance aprs l'interprtation du shell :
dplace le processus dans rpertoire (rpertoire HOME par dfaut).
ls -l bin/A1abc bin/A2xy
Exemple 4.2 si les 2 chiers A1abc et A2xy sont les deux seuls chiers du rpertoire bin qu
cd /users/students/jean commencent par un A suivi d'un chire.
Une facilit oerte par zsh est bien utile quand on a besoin de travailler entre deux Remarque 4.2
rpertoires : Attention, * ne peut dsigner une cha ne de caractres qui comprend un / o
cd - une cha ne de caractres qui commence par un . si ce . est plac en tte ou just
permet de se dplacer dans le rpertoire o- l'on tait avant le dernier dplacement. derrire un /. Ces deux exceptions sont aussi valables pour les caractres spciau
? et  ].
4.4 Acher le rpertoire courant (pwd) Autrement dit, le caractre . doit tre explicitement dsign s'il est plac au dbu
d'un nom terminal de chier. Par exemple, si on veut tous les chiers du rpertoir
pwd
courant qui se terminent par la lettre c (y compris ceux qui commencent par un .
Il est souvent plus prudent de taper cette commande avant d'eectuer une commande il faut taper
dangereuse (suppression de chiers par exemple) pour savoir o- l'on est plac dans l'arbo- ls -d .*c *c
rescence. L'interprtation par le shell de ces caractres spciaux peut avoir des eets indsirable
car le shell l'eectue n'importe o- dans une commande. On peut utiliser \ pour vite
4.5 Caractres spciaux pour le shell cette interprtation sur le caractre suivant. On peut aussi utiliser " ou ' pour empche
l'interprtation sur une portion de texte (voir 14.9).
4.5.1 Gnration des noms de chiers (*,?, ) 4.5.2 Le caract
re spcial 
Les caractres  * ?  ] sont interprts par le shell quand ils gurent dans une com-
mande. Cette interprtation s'appelle la gnration des noms de chiers. Le shell interprte Pour ksh et zsh (mais pas pour sh ), le caractre  ~ (seul ou plac en tte de mot)
chaque mot qui les contient comme un modle de noms de chiers : il remplace le mot par une signi cation particulire :
une liste alphabtique des noms des chiers qui correspondent  ce modle.  dsigne le rpertoire HOME de l'utilisateur,
Si aucun chier ne correspond au modle, le modle est laiss tel quel par sh et ksh. Pour utilisateur
zsh, c'est le cas si l'option NO_NOMATCH est positionne (voir 14.1.2), sinon, zsh interrompt dsigne le rpertoire HOME de l'utilisateur indiqu.
l'interprtation de la commande et ne lance pas son excution. 1. Il faut se souvenir (voir 14.11.1) que, sous zsh et sans indication particuli re, un shellscript est ex
cu
* dsigne zro, un ou plusieurs caractres, par sh et il faut donc utiliser cette syntaxe dans les shellscripts
32 CHAPITRE 4. COMMANDES LIES  L'ARBORESCENCE DES FICHIERS 4.7. RECHERCHER DES FICHIERS DANS L'ARBORESCENCE (FIND, LOCATE)3
Exemples 4.4 reconnait les caractres *, ?, ] (attention, la ngation des caractres entre crochets es
(a) cp ~/fich ~/bin donne par un ! et pas par un ^). Un  . n'est reconnu en dbut de nom que s'il est donn
(b) ls -l ~toto/bin/fich
explicitement.
Exemple 4.5
4.5.3 Le caract
re spcial # find /usr -name "info*" -print

Dans les shellscripts, le shell considre que tout mot qui commence par un # est le recherche tous les chiers situs sous /usr dont le nom commence par info. On do
dbut d'un commentaire qui va jusqu' la n de la ligne. Si un mot commence par un # entourer info* avec des guillemets pour viter le remplacement (par le shell) de * pa
et n'introduit pas un commentaire, il faut donc le faire prcder de  n. Un #  l'intrieur des noms de chiers (voir 14.8).
d'un mot n'est pas considr comme un caractre spcial. La commande nd a de nombreuses autres options qui permettent de rechercher le
Remarques 4.3 chiers qui vri ent certains critres. En voici quelques unes :
(a) En mode interactif (c'est--dire lorsque la commande est tape directement au clavier -size n taille en nombre de blocs de 512 octets
par l'utilisateur), zsh (mais pas ksh ) ne considre pas # comme un caractre spcial. -mtime n nombre de jours depuis la dernire modi cation
-atime n nombre de jours depuis le dernier accs
(b) Voir le cas particulier d'un chier excutable dont la premire ligne commence par Dans les options ci-dessus, n peut tre remplac par +n (nombre suprieur  n) ou pa
 #! en 14.11.1. -n (nombre infrieur  n).
-user nom propritaire
4.5.4 Autres caract
res spciaux -type t type du chier (un f pour un chier ordinaire et les autres abrviation
comme dans la commande ls -l * voir 4.2)
Sous zsh, ! et la tabulation sont des caractres particuliers. -perm nb_octal
! est li  l'historique des commandes. Si on veut l'utiliser dans un autre sens, il faut le est vrai si le chier a les autorisations nb_octal
faire prcder de \. Ce caractre tant li  l'historique des commandes n'a d'utilit qu'en -perm -nb_octal
interactif. zsh ne le considre donc pas comme un caractre spcial dans un shellscript. est vrai si le chier a au moins les autorisations nb_octal
La tabulation permet la compltion de commande. Si on veut insrer une tabulation Les deux options  -exec et  -ok permettent d'excuter une commande sur les chier
dans une commande, on la fait prcder de Ctrl V. qui vri ent les critres prcdents. Le chier examin peut tre dsign par  {} (isol de
autres caractres) dans la commande. Ces deux options renvoient vrai si le code retour d
la commande est 0 (voir 14.1.6). L'option  -ok demande une con rmation de l'utilisateu
4.6 Acher le type d'un chier ( le) avant l'excution de la commande. Il ne faut pas oublier le * nal qui indique que l
commande est nie. Il doit tre prcd par  \ pour que le shell ne l'interprte pas.
file fichiers... -exec commande n
tente de deviner le type de chier (rpertoire, excutable binaire, shellscript, ASCII, lan- -ok commande n
gage, etc.). Toutes ces options peuvent tre relies par les oprateurs logiques  ! (ngation),  -o
(ou logique) et regroupes avec des parenthses. Le et logique est obtenu par la juxtapo
4.7 Rechercher des chiers dans l'arborescence ( nd, lo- sition des options.
Les options sont examines (et excutes pour -print, -exec et -ok) tant que la cond
cate) tion peut tre satisfaite pour le chier en cours d'examen. Ds que la condition ne peu
plus tre satisfaite nd passe au chier suivant.
find rpertoires... -name modle-nom -print
ache les noms des chiers dont les noms correspondent  modle-nom et situs dans Exemples 4.6
l'arborescence des rpertoires. (a) find ~ -mtime -10 -print
modle-nom peut comporter des caractres spciaux semblables aux caractres spciaux ache les noms des chiers de l'arborescence du rpertoire HOME de l'utilisateu
utiliss dans la gnration des noms de chiers par le shell (voir 4.5). Plus exactement, nd qui ont t modi s dans les dix derniers jours.
34 CHAPITRE 4. COMMANDES LIES  L'ARBORESCENCE DES FICHIERS 3
(b) find /users -user toto -mtime -10 -exec ls -ld {} \#
ache des renseignements dtaills sur les chiers de l'arborescence de /users, qui
appartiennent  toto et qui ont t modi s dans les 10 derniers jours.
(c) find ~toto ! -user toto -exec ls -ld {} \#
ache des renseignements dtaills sur les chiers qui n'appartiennent pas  toto
dans son rpertoire HOME. Chapitre 5
(d) find ~toto -perm -002 -exec ls -ld {} \#
ache des renseignements dtaills sur les chiers du rpertoire HOME de toto, qui
ont (au moins) l'autorisation d'criture pour les autres. Protection des
chiers
(e) find ~ -name core -ok rm {} \#
supprime (aprs con rmation par l'utilisateur) tous les chiers core situs sous le
rpertoire HOME.
Les chiers core sont cres automatiquement quand certains programmes s'inter-
5.1 Changement des autorisations (chmod)
rompent par suite d'une erreur. Ils peuvent servir aux experts pour trouver la cause chmod -R] mode-accs fichiers...
de l'erreur. donne des autorisations aux chiers. Seuls le propritaire du chier et le super utilisateu
(f) find . \( -name "*.java" -o -name "*.html" \) -exec more {} \#
peuvent utiliser chmod.
ache page  page tous les chiers "*.java" et "*.html" de l'arborescence du rper- mode-accs indique quelles sont les autorisations que l'on donne * on peut donner ce
toire courant. autorisations sous forme absolue ou symbolique.
L'option -R (rcursif) indique que, si un des chiers est un rpertoire, chmod do
locate modle-de-nom... changer les autorisations de toute l'arborescence du rpertoire.
recherche les chiers dont le nom correspond  modle-de-nom. Mode d'accs absolu
Si modle-de-nom contient des jokers (*,? ou  ]), locate donne tous les chiers dont Les autorisations sont donnes par mode-accs sous forme d'un nombre octal compos
le nom contient modle-de-nom. Sinon elle donne les chiers dont le nom correspond au de 3 chires.
modle.
Cette commande GNU n'est pas toujours installe sur les systmes Unix. Si l'admi- Le premier chire correspond aux autorisations que l'on donne au propritaire de
nistrateur l'a installe, elle permet de grer une base de donnes des chiers disponibles. chiers, le deuxime correspond au groupe des chiers et le troisime correspond  tous le
Dans ce cas, cette commande est normment plus rapide que la commande nd et charge autres utilisateurs.
beaucoup moins le systme. Pour calculer chacun des chires, on ajoute les valeurs des autorisations en comptan
4 pour read, 2 pour write et 1 pour execute.
d'o-, par exemple,
chmod 755 fichier
donne toutes les autorisations au propritaire et les autorisations de lecture et d'excutio
aux autres.
Mode d'accs symbolique
Les autorisations sont donnes par mode-accs sous la forme suivante :
qui]... op permissions... op permissions ...]
qui dsigne celui ou ceux qui recevront ces autorisations : u (propritaire), g (groupe
o (les autres) ou a (tous les 3, par dfaut)
op indique si l'on veut ajouter ou enlever des autorisations : + (ajouter), - (enlever
= (donner les autorisations comme dans le mode absolu)
36 CHAPITRE 5. PROTECTION DES FICHIERS 3
Les permissions sont donnes par r, w ou x.
Exemples 5.1
(a) chmod ug+wx fichier
(b) chmod ug+w-x fich
(c) chmod o=w fich Chapitre 6
5.2 Masque pour les autorisations (umask) Commandes d'observation du systme
umask nnn]
donne la valeur octale nnn (cf. mode absolu de chmod en 5.1) au masque qui sera uti-
lis pour limiter les autorisations que recevront les nouveaux chiers au moment de leur
cration. 6.1 Date et Heure (date)
Exemple 5.2 date
umask 026 ache la date et l'heure. Des formats d'achage sont disponibles en option.
les chiers et rpertoires qui seront crs dans la suite de la session n'auront ni
l'autorisation d'criture pour le groupe (2) ni les autorisations d'criture et de lecture
pour les autres (6). 6.2 Nom de l'ordinateur (hostname)
umask
hostname
(seul) ache le masque en cours. Celui-ci est en gnral 022 si l'utilisateur n'a pas lanc de ache le nom de l'ordinateur sur lequel la commande s'excute (taloa.unice.fr, par exemp
commande umask. Les nouveaux chiers sont alors crs avec les autorisations  rw-r--r--
(car ils ne sont pas supposs tre excutables) et les nouveaux rpertoires avec les autori-
sations  rwxr-xr-x. 6.3 Nom du systme d'exploitation (uname)
uname -a
ache des informations sur le systme d'exploitation.

6.4 Information sur les utilisateurs (who, nger)


who
ache le nom de login, le nom du terminal et l'heure du login pour chaque utilisateu
actuellement en ligne.
Si un utilisateur s'est connect par l'intermdiaire du rseau (et pas directement sur l
machine qui excute la commande who), le nom de la machine d'o- il vient est indiqu
entre parenthses  la n de la ligne.
who am I
ache les informations sur l'utilisateur qui s'est connect pour dmarrer la session en cour
whoami
ache le nom de login de l'utilisateur qui a lanc la commande.
38 CHAPITRE 6. COMMANDES D'OBSERVATION DU SYSTME 6.7. ESPACE DISQUE OCCUP 3
finger @machines...] ypcat -k network
ache les informations de la commande who et des informations informelles sur les utili- ache l'ensemble des  netgroups  (voir cours sur les rseaux). L'option  -k permet d'avo
sateurs (leur nom et prnoms, leur tlphone,. . . ) actuellement connects sur les machines les noms des groupes et pas seulement les noms des membres.
(la machine locale par dfaut). ypwhich -x
finger utilisateur@machine]... ache les noms possibles pour les dirents types de chiers que le systme NIS peut gre
ache les informations sur les utilisateurs spci s, mme s'il ne sont pas connects. nger
donne plus d'informations sur les utilisateurs que lorsque l'on n'indique pas d'utilisateurs
en particulier. De plus les contenus des chiers .plan et .project des rpertoires HOME 6.7 Espace disque occup
des utilisateurs sont achs. Pour  utilisateur on peut donner le nom de login ou le nom
rel ach par la commande. 6.7.1 Place occupe par la branche d'un rpertoire (du)
rusers du options...] fichiers...]
devrait donner une liste des utilisateurs connects sur le rseau (mais 'a ne marche pas ache le nombre de blocs occups par les chiers indiqus (rpertoire en cours par dfaut
toujours...). Si un des chiers est un rpertoire, c'est le nombre de blocs occups par toute l'arborescenc
place sous le rpertoire qui est ache.
6.5 Dernires connexions au systme (last) Sous Unix Systme V ou OSF les blocs ont une taille de 512 octets, sous Unix BSD i
ont une taille de 1 Ko. Consultez le manuel en ligne de du pour en savoir plus.
Il est prudent de vri er rgulirement que personne n'est entr sous son propre nom. -s ache seulement le nombre total de blocs
last -n] utilisateur] terminal]
-a ache la taille de tous les chiers et rpertoires
ache des informations sur les dernires connexions. On peut se limiter aux connexions Exemple 6.2
d'un utilisateur ou aux connexions tablies  partir d'un certain terminal. On peut aussi du -s $HOME
se limiter aux n dernires connexions.
Exemple 6.1 6.7.2 Place libre d'un syst
me de chiers (df)
last -3 toto
df systme-fichiers] fichier]
ache les trois dernires connexions (y compris l'actuelle) de toto. ache le nombre de blocs de 512 octets disponibles pour le systme de chiers spci
Remarque 6.1 Le systme de chiers peut tre spci  par le nom du priphrique (/dev/. . . ) ou par u
last ne donne pas toujours les connexions  partir des terminaux X ou des stations chier quelconque du systme mont.
de travail. Cela dpend du systme de gestion des connexions de X Window et des df (sans argument) ache les renseignements sur tous les systmes monts (voir 1.6.1
chiers de con guration installs par l'administrateur systme. Exemples 6.3
(a) df /dev/rz3a
6.6 Systme  Network Information Service (NIS) ache les renseignements sur le systme de chier du systme de chier li au nom
de chier spcial /dev/rz3a (une partition d'un disque).
Le systme NIS (anciennement appel  Yellow Pages) permet de concentrer sur une (b) df .
seule machine la gestion de certains chiers utiliss pour l'administration du systme Unix. ache les renseignements sur le systme de chiers sur lequel se trouve le rpertoir
Il permet en particulier de grer les chiers qui contiennent les informations sur les courant.
utilisateurs (noms, mot de passe, rpertoire HOME, programme de dmarrage) et sur les
noms et numros IP des machines du rseau local.
ypcat passwd
ache l'ensemble du chier des mots de passe (si l'administrateur systme l'a autoris).
6.8 Nom du terminal utilis (tty)
ypcat hosts tty
ache l'ensemble des noms et des numros IP des machines du rseau local. ache le nom du terminal associ  l'entre standard du processus courant. Le code retou
40 CHAPITRE 6. COMMANDES D'OBSERVATION DU SYSTME 4
(voir 14.1.6) est 0 si l'entre standard est un terminal et 1 sinon.

Chapitre 7
Commandes pour la gestion des
processus
Pour la gestion des processus on se reportera aussi aux facilits oertes par les shel
ksh et zsh dcrites en 14.5.1 et  la section 14.5 sur les processus lancs en arrire-plan.

7.1 Processus en cours d'excution (ps)


ps options...]
ache des renseignements sur les processus en cours d'excution et associs au termina
numro de processus, terminal qui a lanc le processus, temps d'excution du processu
nom de la commande qui a lanc le processus.
Si aucune option n'est spci e, ps donne les informations sur les processus associs
l'utilisateur qui a lanc la commande.
Cette commande ore de nombreuses options qui varient suivant les systmes Unix.
existe au moins trois versions direntes : BSD, OSF et Systme V (ou Solaris). Voici le
principales options oertes par la version Unix BSD :
-a tous les processus lancs depuis un terminal par tous les utilisateurs,
-x tous les processus de l'utilisateur, mme ceux qui n'ont pas t lancs depuis u
terminal
-l donne des renseignements supplmentaires, en particulier le pid du processus pr
(PPID) de chacun des processus,
-e ache les valeurs des variables d'environnement,
-w ache en 132 colonnes (80 colonnes par dfaut),
-ww ache autant de caractres qu'il faut pour avoir tous les renseignements su
chaque processus (utile avec l'option -e).
Exemple 7.1
Pour acher des informations dtailles sur tous les processus sans exception on do
lancer dans les direntes versions :
en BSD : ps -axlww
42 CHAPITRE 7. COMMANDES POUR LA GESTION DES PROCESSUS 7.3. LANCEMENT AUTOMATIQUE DE PROCESSUS  DES MOMENTS DONNS (
en OSF : ps -Al ww 7.3 Lancement automatique de processus  des moment
en Systme V : ps -Afl donns (at, crontab)
Si l'administrateur du systme l'a autoris (voir le manuel en ligne des commandes a
7.2 Supprimer un processus en cours d'excution (kill) et crontab ), les utilisateurs peuvent programmer le lancement automatique de processu
On peut supprimer un processus lanc en avant-plan en tapant la touche d'annulation mme lorsqu'il ne sont pas connects.
(le plus souvent Ctrl-C) dans la fentre dans laquelle ce processus a t lanc. Pour les at sert  lancer une commande  un moment donn. crontab est plus spcialemen
processus lancs en arrire-plan (voir 14.5), cette touche d'annulation n'a aucun eet. Pour utilis pour lancer des commandes  intervalles rguliers (chaque jour par exemple).
les supprimer il faut utiliser la commande kill. Sans entrer dans les dtails, voici des exemples standards :
at -f ~/fichier 3:00 am January 24
kill -signal] pid
lance les commandes contenues dans ~/fichier (indiquez toujours un nom absolu)
envoie le signal indiqu au processus dont pid est le numro de processus. signal est un 3 heures du matin le 24 janvier.
numro de signal compris entre 0 et 15 (15 par dfaut) ou le symbole d'un signal : HUP at -l
(1), INT (2), QUIT (3), KILL (9), TERM (15), etc... (taper  kill -l pour avoir la liste ache les commandes programmes.
complte des noms des signaux.) crontab fichier-cron

Exemples 7.2 programme ce qui est indiqu dans le chier fichier-cron. Voici un exemple de conten
(a) kill 128 d'un tel chier (voir le manuel en ligne pour plus d'explications) :
# Lance 'dumptout -f' tous les jours (sauf le lundi) ' 2h du matin
(b) kill -9 128
# (0 minutes), tous les jours du mois, tous les mois,
# le dimanche (0) et du mardi au vendredi (2-6)
(c) kill %2 0 2 * * 0,2-6 /usr/adm/dumptout -f
tue le processus lanc en arrire-plan qui a le numro 2 pour le shell dans lequel la crontab -l
commande kill a t tape. ache les commandes programmes.
crontab -e
(d) kill -9 -1 permet de modi er les commandes programmes.
tue tous les processus lancs par l'utilisateur qui a tap le kill. 4 excuter en cas
d'anomalie et d'urgence. Par exemple quand des nouveaux processus sont engendrs
 grande vitesse par une erreur de programmation. 7.4 Gestion du plan d'un processus par le shell
Les super-utilisateurs peuvent tuer tous les processus. L'utilisateur normal ne peut tuer La plupart des shells (mais pas sh ) permettent de grer le plan o- se droule les pro
que ses propres processus. cessus (en arrire-plan ou non). Cette gestion est tudie en 14.5.1.
Remarque 7.1
Le signal 15 (envoy par dfaut) peut tre intercept par le processus  qui il est
destin. Ce processus peut avoir l'amabilit de laisser la place nette avant de mourir
(par exemple, il peut eacer les chiers temporaires qu'il a crs). Il peut aussi refuser
de mourir et continuer de s'excuter normalement.
Si on veut tre certain de tuer un processus, il faut lui envoyer le signal 9 qui ne peut
tre intercept.
Pour laisser une chance au processus de mourir proprement, il est conseill d'essayer
d'abord de tuer avec le signal 15 et de n'utiliser le signal 9 que si le processus vis ne
veut pas se laisser tuer.
44CHAPITRE 8. AFFICHER, IMPRIMER, ENVOYER LE CONTENU D'UN FICHIER 8.2. AFFICHER LES OCTETS D'UN FICHIER (OD) 4
ligne2
<-- on tape la touche Ctrl] D
cre 
nouveaufichier  avec deux lignes de texte.

Chapitre 8 8.2 Acher les octets d'un chier (od)


Cette commande ne sera pas tudie ici mais il faut conna tre son existence pour le
cas o- l'on doit examiner le contenu des chiers qui ne contiennent pas du texte achabl
Acher, imprimer, envoyer le contenu emacs possde aussi le mode de travail Hexl qui permet de voir, et mme de modi e
les octets d'un chier. On tape M-x hexl- nd- le pour charger le chier binaire. On peu
d'un
chier aussi simplement passer en mode Hexl une fois que l'on a charg un chier dans un bue
(M-x hexl-mode).

8.3 Acher page  page (more) - Notion de pipe


8.1 Acher le contenu d'un chier, concatner plusieurs
chiers (cat) - Notion de redirection more fichiers...]
ache le contenu des chiers page par page. Le chier par dfaut est l'entre standard.
En bas de chaque page on dispose de plusieurs commandes :
cat -nsv] fichiers...]
ache le contenu des chiers. h ache la liste des commandes disponibles
Si aucun chier n'est spci , l'entre standard est prise par dfaut. Retour] ache une ligne de plus
Options espace] ache l'cran suivant
-n numrote les lignes iespace] ache i lignes de plus
-s runit plusieurs lignes vides en une seule ligne Ctrl B revient  la page prcdente (ne marche pas si le 0ot de donne ne vient pa
-v ache les caractres non visibles d'un chier ordinaire)
q ou Q sort de more
Exemples 8.1 = ache le numro de la ligne en cours
(a) cat /etc/passwd /texte recherche un texte : ache un nouvel cran qui commence 2 lignes avant l
1re ligne qui contient texte
(b) cat n refait la dernire recherche
ache (plus exactement, envoie sur la sortie standard) les lignes qui sont tapes au :n va au chier suivant
clavier. On termine en tapant Ctrl D qui est transform en annonce de  n de chier :f ache le nom du chier et le numro de la ligne
par le driver de terminal. C'est surtout utile avec une redirection (voir ci-dessous). Gr&ce  un pipe (notion tudie en 14.3) la commande more peut recevoir sur so
Le nom de la commande vient de concatner car entre standard ce qu'une autre commande a envoy vers la sortie standard. On peu
ainsi eectuer un achage page  page de ce qu'aurait ach cette autre commande. Pa
cat fich1 fich2 >fich3
exemple :
concatne ch1 et ch2 dans ch3.  > est un symbole de redirection (la sortie standard ls -l /bin | more
est redirige vers ch3 * par dfaut, la sortie standard est l'cran). Cette notion sera dtaille
en 14.2.
La commande cat permet de crer des petits chiers sans passer par un diteur de
textes ( $ est le prompt dans l'exemple suivant) :
8.4 Sorties sur les imprimantes
$ cat >nouveaufichier Lorsque l'utilisateur lance l'impression d'un chier, le contenu de ce chier est envoy
ligne1 dans une le d'attente. Il sera imprim lorsque le programme gestionnaire du spoule (tra
46CHAPITRE 8. AFFICHER, IMPRIMER, ENVOYER LE CONTENU D'UN FICHIER 8.4. SORTIES SUR LES IMPRIMANTES 4
duction du terme anglais spool qui est d'ailleurs le plus souvent utilis) le slectionnera. Options
Ce systme de spool permet de redonner la main tout de suite  l'utilisateur sans attendre -Pimprimante dirige l'impression vers l'imprimante spci e
la n de l'impression du contenu du chier. -h supprime la bannire d'impression (premire page o- sont imprims le nom
Il existe deux systmes d'impression : lp (Unix Systme V) et lpr (Unix BSD). Le de l'utilisateur qui a lanc l'impression et diverses autres informations)
systme dcrit ici est le systme lpr. Avec le systme lp, la commande lp remplace la
commande lpr et la commande lpstat donne des informations sur le systme d'impression, Exemples 8.3
en particulier sur les noms des imprimantes. Les systmes Unix actuels disposent des deux (a) lpr -h -Plp3 fichier
systmes d'impression et des passerelles sont souvent installes par l'administrateur pour (b) ls -l | lpr -h
laisser le choix  l'utilisateur : un seul des deux systmes fonctionne mais les commandes
de l'autre systme sont disponibles (elles font appel au seul systme install sans que
l'utilisateur s'en aper'oive). 8.4.3 Informations sur les requtes d'impression (lpq)
lpq -Pimprimante] utilisateur]
8.4.1 Informations sur le syst
me d'impression (lpstat, printcap) ache des renseignements (utilisateur, position dans la le d'attente, nom du chier
imprimer, identi cateur de la requte, taille de ce qui sera imprim) sur les requtes d'im
En Unix BSD, le chier /etc/printcap contient les noms et descriptifs des impri- pressions actuellement en attente d'tre imprimes.
mantes du systme. Sous Unix Systme V et OSF, la commande lpstat permet d'avoir des Options
informations sur le systme d'impression. -Pimprimante
lpstat options ] limitent les informations aux requtes envoyes sur l'imprimante
Options utilisateur limitent les informations aux requtes lances par utilisateur.
-d donne l'imprimante par dfaut
-p statut des imprimantes et de la gestion des les d'attente associes Exemple 8.4
-r tat du dmon d'impression lpq -Plp3 jean
-s un rsum des prcedentes options donne les informations sur les requtes envoyes par jean sur l'imprimante lp3.
-t tout ce que vous avez toujours voulu savoir sur le systme d'impression
-v noms des imprimantes et des noms de chiers spciaux ou de machines 8.4.4 Suppressions de requtes d'impression (lprm, cancel)
distantes associes
lprm -Pimprimante] -] identificateur-requte]
Exemple 8.2 permet  un utilisateur de supprimer une requte d'impression qu'il avait prcdemmen
Certaines de ces options peuvent tre suivies de listes d'imprimantes, d'utilisateurs lance (si l'impression est dj commence, elle est interrompue). On ne peut supprime
ou d'identi cateurs de requtes d'impression. les requtes d'un autre utilisateur (sauf si l'on est le super-utilisateur). Si aucune optio
lpstat -p lp17,lp30 n'est spci e, la requte en cours d'impression est supprime sur l'imprimante par dfau
si elle appartient  l'utilisateur qui a lanc la commande lprm.
Options
8.4.2 Lancement d'une requte d'impression (lpr) -Pimprimante
lpr options] fichiers...] supprime toutes les requtes que l'utilisateur a lances sur imprimante
place une liste de chiers dans la le d'attente d'une imprimante. Un saut de page est - supprime toutes les requtes que l'utilisateur a lances
envoy aprs chaque chier. identicateur-requte
Si la liste de chiers est vide, c'est l'entre standard qui est place en le d'attente (ce supprime la requte d nie par son identi cateur (on peut faire ache
qui permet d'utiliser lpr  la n d'un pipe). l'identi cateur par la commande lpq tudie en 8.4.3).
Dans tout systme, l'administrateur donne une imprimante par dfaut vers laquelle les Exemples 8.5
requtes sont diriges (imprimante de nom lp). La variable PRINTER peut contenir le (a) lprm -Plp1 26
nom d'une autre imprimante. On peut aussi utiliser l'option -P.
Les options sont nombreuses et peuvent varier suivant la version du systme. (b) lprm -
48CHAPITRE 8. AFFICHER, IMPRIMER, ENVOYER LE CONTENU D'UN FICHIER 8.7. PASSER EN POSTSCRIPT (A2PS) 4
Si la commande lprm semble ne pas fonctionner, on peut essayer la commande cancel. De plus, les noms des options peuvent changer avec les versions de a2ps. Heureusemen
Par exemple, pour supprimer les requtes que l'utilisateur toto a envoyes sur l'imprimante l'une des options que l'on retrouve dans toutes les versions est l'option  -h qui donne un
lp0, on tapera : liste des options disponibles.
cancel -u toto lp0 Les options globales permettent d'indiquer si le Postscript gnr est envoy sur l
sortie standard ou sur une certaine imprimante, s'il faut imprimer les chiers binaires,
les pages auront une en-tte, etc.
8.5 Envoyer le contenu d'un chier (mail) Les options particulires  chaque chier (ou groupe de noms de chiers qui suivent le
options) permettent d'indiquer si on veut une ou deux pages par feuille physique de papie
Le plus simple pour envoyer par courrier lectronique un chier est d'utiliser la com- si on veut le mode de positionnement portrait ou paysage (sur la largeur de la pag
mande mail avec une redirection de l'entre standard (voir 14.2.4) : landscape en anglais), etc. Il existe de trs nombreuses options, souvent trs utiles que l'o
mail adresse <fichier aura intrt  lire dans le manuel en ligne.
envoie le contenu de chier  l'utilisateur dsign par adresse.
Le chier doit tre un chier texte. Si on veut envoyer un chier binaire, il faut le traiter Exemple 8.7
auparavant par uuencode (voir cours sur les rseaux). Sur la version de a2ps installe aujourd'hui sur les stations Sun de l'universit d
Nice, la commande suivante imprime le chier truc.java sur l'imprimante par dfau
Exemple 8.6 deux pages par feuille en mode paysage :
mail -s "Fichier fich" toto@machine.unice.fr < rep/fich a2ps truc.java | lpr
L'option  -s permet de donner un sujet au message * elle n'est pas disponible sur Pour imprimer une page par feuille en mode portrait :
toutes les versions de la commande. a2ps -P -1 truc.java | lpr
Nous ne dcrirons pas davantage la commande mail puisque nous utiliserons d'autres
commandes (netscape, xmh ou emacs ) pour envoyer et recevoir du courrier lectronique.

8.6 Mise en page (pr)


pr options] fichiers...]
met en forme les chiers (longueur de ligne, longueur de page, en-tte, ...) et envoie le
rsultat vers la sortie standard. pr prend l'entre standard par dfaut si aucun chier n'est
indiqu.
pr possde de nombreuses options que nous ne dcrirons pas ici.

8.7 Passer en Postscript (a2ps)


a2ps options-globales] options-partic.] fichiers]...
passe le contenu d'un ou plusieurs chiers (entre standard par dfaut) en Postscript.
C'est une commande trs utile pour imprimer le contenu de chiers sur des imprimantes
Postscript. En particulier, les programmes informatiques sont souvent traits d'une fa'on
particulire par a2ps qui imprimera par exemple tous les mots-cls du langage en caractres
gras.
Attention, le fonctionnement standard dpend des versions intalles, en particulier pour
l'endroit o- est envoy le Postscript gnr.
50 CHAPITRE 9. GESTION DES FICHIERS 9.2. LIENS AVEC MME NUMRO DE I-NODE (LN) 5
9.2 Liens avec mme numro de i-node (ln)
Un rpertoire contient des liens qui rfrencent les chiers placs sous le rpertoir
Un chier peut avoir plusieurs liens qui le rfrence. On peut ajouter un lien vers un chie
dans un autre rpertoire que le rpertoire de cration du chier en utilisant la command
Chapitre 9 ln.
Un lien permet de donner plusieurs noms  un mme chier physique. La cratio
d'un lien permet, par exemple, de partager une commande entre plusieurs utilisateurs san
Gestion des
chiers dupliquer son contenu.
ln -f] fichier1 fichier2]
cre un lien chier2 : chier2 sera un chier qui aura le mme i-node que chier1.
chier1 doit dj exister et ne pas tre un rpertoire. Les deux chiers doivent apparten
Ce chapitre traite des commandes qui travaillent sur des chiers ordinaires en les consi-  un mme systme de chiers.
drant comme un tout, sans faire d'oprations sur le contenu des chiers. L'utilisateur doit avoir l'autorisation d'criture sur le rpertoire de chier2. L'autorisa
tion d'criture sur le chier chier2 n'est pas ncessaire (comme pour rm * voir 9.4).
chier2 est optionnel. S'il n'est pas indiqu, le lien se fait sur le chier situ dans
9.1 Copier des chiers (cp) rpertoire courant de mme nom terminal que chier1.
L'option  -f permet d'craser chier2 s'il existe dj.
cp -ip] fichier1 fichier2 ln -f] fichiers... rpertoire
copie le chier ordinaire chier1 sur le chier ordinaire chier2. cre des liens entre les chiers et les chiers situs sous le rpertoire et de mme nom
L'utilisateur doit avoir l'autorisation de lecture sur le chier chier1. terminal que les chiers. Les chiers doivent appartenir  un mme systme de chiers qu
Si chier2 existe, l'utilisateur doit avoir l'autorisation d'criture dans ce chier. Dans le rpertoire. Les chiers ne peuvent tre des rpertoires.
ce cas, le contenu de chier2 est cras par celui de chier1. chier2 garde son propritaire,
son groupe et ses autorisations. Remarques 9.2
Si chier2 n'existe pas, l'utilisateur doit avoir l'autorisation d'criture sur le rpertoire (a) Quand un lien a t cr entre deux chiers, les deux chiers jouent ensuite un r
de chier2. Dans ce cas, chier2 est cr et son propritaire et son groupe sont ceux de symtrique et il n'y a pas lieu de distinguer un chier originel parmi tous ces chier
l'utilisateur et les autorisations sont celles de chier1 (mais tient compte de la valeur du
masque de umask * voir 5.2). (b) Tous les chiers lis ont le mme i-node. Ceci implique que lorsque l'on modi e
Options contenu ou les autorisations d'un chier, tous les chiers qui lui sont lis sont modi 
-i fait acher un message de demande de con rmation si chier2 existe dj de mme. Le propritaire, le groupe et les dates de dernire modi cation et de cratio
-p conserve les dates de modi cation et d'accs, le propritaire et le groupe, le mode sont les mmes pour tous les chiers lis correspondant  un mme chier physique
d'accs de chier1 pour chier2 (ne tient pas compte du masque pour le mode
d'accs * voir 5.2) (c) La commande  ls -l  renverra un nombre de liens suprieur  1 pour les chier
cp -ip] fichiers... rpertoire
ainsi lis.
copie les chiers dans le rpertoire.
Exemples 9.1 (d) Si on supprime un des deux chiers par la commande rm, l'autre continuera  existe
(a) cp fich* jean/courrier avec un nombre de lien ach par  ls -l diminu de 1.
(b) cp fichier1 fichier2 jean Exemples 9.2
Remarque 9.1 (a) ln rep1/fichier rep2
Si un des chiers est un rpertoire, cp envoie un message d'erreur mais les autres
chiers sont copis (voir 10.4 pour la copie de rpertoires). (b) ln rep1/fichier rep2/fichier2
52 CHAPITRE 9. GESTION DES FICHIERS 9.5. DPLACER, RENOMMER DES FICHIERS (MV) 5
9.3 Liens symboliques (ln -s) Cette commande ncessite l'autorisation d'criture sur le rpertoire du chier mais pa
la lecture ou l'criture sur le chier lui-mme (mais si l'utilisateur n'a pas l'autorisatio
Les liens tudis dans la section prcdente ont quelques limitations. En particulier, d'criture sur le chier, une con rmation est demande).
les deux chiers lis doivent tre placs dans un mme systme de chiers et les chiers Options
auxquels on ajoute un lien (ceux que l'on rfrence) ne peuvent tre des rpertoires. Les -f pas de demande de con rmation quand on n'a pas l'autorisation d'criture sur
liens symboliques orent plus de souplesse. chier, renvoie un code retour 0 (tout s'est bien pass) mme si un des chier
Un lien symbolique est un chier de type spcial qui contient le nom d'un autre chier n'existe pas
auquel il est li. Toutes les commandes usuelles qui contiendront le nom du lien symbolique, -r dtruit tout le contenu d'un rpertoire et le rpertoire lui-mme
travailleront en fait avec le chier dont le nom est contenu dans le lien symbolique. -i demande de con rmation pour chaque chier (ou rpertoire avec l'option -r)
ln -s fichier1 fichier2]
cre un lien symbolique chier2 qui se rfrera  chier1. chier1 et chier2 peuvent tre Exemple 9.4
des rpertoires et ils peuvent appartenir  deux systmes de chiers dirents. chier1 rm -fr l*
peut mme tre supprim ensuite (et dans ce cas, toute rfrence  chier2 provoquera une Attention  ne pas glisser par mgarde un espace entre le l et le *. On se m er
erreur) ! aussi des claviers dont la touche l ne fonctionne pas bien ! Il est prudent de lire su
chier1 peut tre un rpertoire. l'cran la commande tape avant de la lancer.
chier2 est optionnel. S'il n'est pas indiqu, le lien se fait avec le chier situ dans le
rpertoire courant de mme nom terminal que chier1.
On peut aussi indiquer un rpertoire comme but (comme pour les commandes cp ou
9.5 Dplacer, renommer des chiers (mv)
mv ) : mv fich1 fich2
ln -s fichiers... rpertoire renomme ch1 en ch2. Le chier peut changer de rpertoire  cette occasion.
mv fichiers... rpertoire
Exemple 9.3 les chiers passent sous rpertoire. Ils gardent le mme nom terminal.
ln -s /usr/new/emacs/emacs bin
cre un lien symbolique bin/emacs qui pointe sur /usr/new/emacs/emacs. Exemples 9.5
(a) mv fichier1 rep/fichier2
Remarques 9.3
(a)  ls -l fichier d'un chier (ou rpertoire) qui est un lien symbolique, ache le (b) mv jean/fich1 jean/fich2 pierre
nom du chier sur lequel le chier est li. Si on veut les renseignements sur le chier
point (ou les sous- chiers du rpertoire point), il faut utiliser l'option -L de ls. Par
exemple,  ls -lL fichier 9.6 Sauvegarder sur les lecteurs de disquettes des sta
(b) les autorisations sur un lien symbolique n'ont aucune signi cation : les droits rels
tions Sun
sont ceux du chier point. Certaines stations Sun de l'universit de Nice ont des lecteurs de disquettes compatible
avec les lecteurs installs sur les ordinateurs compatibles PC. Les utilisateurs peuvent ain
(c) on fera attention de donner un nom absolu pour chier1, ou un nom relatif par recopier sur des disquettes des programmes rcuprs sur le rseau Internet ou leurs chier
rapport au rpertoire de chier2 pour que le chier point soit retrouv lorsque le de travail pour les emmener sur leur PC personnel.
systme utilisera le lien symbolique. Les sauvegardes sont eectues rgulirement par l'administrateur du systme su
bandes ou autres supports. Pour les chiers importants, deux prcautions valent mieu
qu'une et on peut faire ses propres sauvegardes si on a accs  des stations Sun.
9.4 Supprimer des chiers (rm) Les commandes qui permettent de travailler avec les disquettes sont les commande
mcopy, mdir, etc. (chercher toutes les commandes dont le nom commence par m dans
rm options...] fichiers... rpertoire contenant la commande mcopy). De plus, la commande eject permet d'jecte
enlve le chier de son rpertoire. la disquette du lecteur. On pourra consulter le manuel en ligne pour plus de dtails.
54 CHAPITRE 9. GESTION DES FICHIERS 5
9.7 Compression et dcompression (zip, gzip, compress)
Ces trois commandes permettent de compresser les chiers. On peut ainsi archiver des
chiers non utiliser actuellement en sauvegardant de la place. La commande zip se trouve
sur PC MS-DOS et sur Unix.
Pour compresser des arborescences (tout le contenu d'un rpertoire et de ses sous-
rpertoires) on pourra utiliser la commande tar (voir 10.6). Chapitre 10
Consultez les manuels en ligne de ces commandes pour plus de prcisions.
Travail sur les rpertoires
Les commandes principales de gestion des chiers que l'on a vu au chapitre prcden
permettent de travailler sur les rpertoires. Ce chapitre indique seulement les options o
fonctionnalits lies aux rpertoires. La plupart des options dj vues (par exemple le
options -i de cp ou -f de rm ) sont toujours valables pour les rpertoires.

10.1 Crer un rpertoire (mkdir)


mkdir -p] rpertoires...
cre les rpertoires indiqus.
On doit avoir l'autorisation d'criture dans le rpertoire pre.
En l'absence de masque donn par la commande umask (voir 5.2), les autorisations su
le nouveau rpertoire sont 777.
L'option `-p cre les rpertoires intermdiaires si besoin est.

10.2 Supprimer un rpertoire (rmdir, rm -r))


rmdir rpertoires...
supprime les rpertoires indiqus. Les rpertoires doivent tre vides.
Un autre moyen de supprimer un rpertoire :
rm -r rpertoires...
supprime les rpertoires et toute l'arborescence dont ils sont la racine.
ATTENTION ! rm -r * supprime tout le rpertoire de travail.

10.3 Changer le nom d'un rpertoire (mv)


mv rpertoire1 rpertoire2
56 CHAPITRE 10. TRAVAIL SUR LES RPERTOIRES 10.6. PLIAGE DE RPERTOIRES EN UNE SEUL FICHIER (TAR, CPIO) 5
Autoris seulement si les 2 rpertoires ont le mme parent en Unix Systme V. Unix ln -s /usr/local2/rep1 /usr/local/rep1
BSD l'autorise si les deux rpertoires sont dans le mme systme de chiers. Si le rpertoire /usr/local/rep1 existe dj, on crera des liens symboliques sou
Exemple 10.1 le rpertoire /usr/local/rep1 pour tous les chiers de /usr/local2/rep1 qui son
mv /users/students/jean /users/students/jp
concerns * par exemple, pour fichier1 :
ln -s /usr/local2/rep1/fichier1 /usr/local/rep1

10.4 Copier l'arborescence d'un rpertoire (cp -r) 10.6 Pliage de rpertoires en une seul chier (tar, cpio
cp -r rpertoire1 rpertoire2
copie toute l'arborescence de rpertoire1 sous rpertoire2. La commande tar peut plier un rpertoire en un seul chier. Tous les chiers d
L'endroit o- seront copis les chiers dpend de l'existence du rpertoire rpertoire2. rpertoire sont alors runis en ce chier. Le transfert des chiers sur le rseau et leu
Si celui-ci n'existe pas, il sera cr et il correspondra  rpertoire1. Sinon, les nouveaux archivage en est facilit, surtout si on compacte le chier rsultat.
chiers se retrouveront sous le rpertoire situ dans le rpertoire rpertoire2 et de mme Cette commande possde de nombreuses options. On ne donne ici que les options prin
nom terminal que le nom terminal de rpertoire1. cipales sur des exemples simples.
tar cvf fichier.tar rep
Exemples 10.2
(a) cp -r ~toto/rep . cre le chier fichier.tar qui contiendra tous les chiers des chiers indiqus. Si u
cre (s'il n'existe pas dj) un rpertoire rep sous le rpertoire courant et copie les chier indiqu est un rpertoire (comme ici rep), toute l'arborescence du rpertoire es
chiers de l'utilisateur toto sous ce rpertoire plie dans le chier dont le nom complte l'option  f (l'option  v est l'option verbeuse
Il est fortement conseill d'utiliser un nom relatif pour les chiers plis car on peut ain
(b) cp -r ~toto/rep/. . rcuprer les chiers (par  tar x)  un autre endroit.
copie les chiers de rep directement sous le rpertoire courant tar tvf fichier.tar

Remarque 10.1 liste les noms des chiers plis dans le chier fichier.tar.
tar xvf fichier.tar
La commande suivante copie les chiers placs directement sous un rpertoire rep1 rcupre tous les chiers plis dans fichier.tar.
dans un rpertoire rep2. tar xvf fichier.tar f1 f2
cp rep1/* rep1/.* rep2 rcupre tous les chiers plis dans chier.tar qui ont pour nom f1 ou f2.
Les sous-rpertoires ne seront pas copis et engendreront des messages d'erreurs. La commande cpio permet aussi l'archivage de chiers. Elle ne sera pas tudie ici.

10.5 Lien symbolique (ln -s)


Un lien symbolique peut pointer un rpertoire. Ceci permet d'obtenir une con guration
attendue par un logiciel. Par exemple, beaucoup de logiciels du domaine public travaillent
par dfaut avec des sous-rpertoire de /usr/local. Un lien sur ces rpertoires peut viter de
modi er les chiers de con guration des logiciels lorsque c'est impossible ou trop complexe.
Exemple 10.3
Supposons que le systme de chier qui contient le rpertoire /usr/local n'a pas
assez de place pour accueillir dans /usr/local/rep1 tous les chiers ncessaires au
fonctionnement d'un logiciel. Si le paramtrage du logiciel pour lui indiquer de cher-
cher les chiers  un autre endroit que /usr/local/rep1 est impossible ou complexe,
on peut installer les chiers dans le repertoire /usr/local2/rep1 et taper :
58 CHAPITRE 11. EXPRESSIONS RGULIRES 11.2. EXPRESSIONS RGULIRES REPRSENTANT UN ENSEMBLE DE CARACT
 chane]
dsigne n'importe quel caractre de la cha ne. On peut dsigner plusieurs ca
ractres contigus  l'aide de -. Si le premier caractre de la cha ne est  ^
l'expression dsigne n'importe quel caractre qui n'est pas dans la cha ne.

Chapitre 11 Exemples 11.1


(a) ^ab
dsigne la cha ne ab place en dbut de ligne.

Expressions rgulires (b) 0-9]


dsigne un chire quelconque.
(c) adh-lA-Z]
Ces expressions sont utilises par plusieurs commandes * en particulier par more, emacs, dsigne a ou d ou une lettre minuscule comprise entre h et l, ou une lettre majuscule
grep, ed, sed, awk, perl 1 . Ce sont des cha nes de caractres qui reprsentent des modles (d) ^0-9]
pour des cha nes de caractres. Certains caractres ont des signi cations particulires. dsigne n'importe quel caractre qui n'est pas un chire.
Toutes les commandes qui utilisent les expressions rgulires ne reconnaissent pas toutes
les expressions. Les commandes grep, more et emacs travaillent avec le noyau minimum (e) ^\.
d'expressions rgulires qui sont prsentes dans ce chapitre. Il existe d'autres types d'ex- dsigne une ligne qui commence par un point.
pressions rgulires. Pour conna tre exactement les expressions reconnues par une com-
mande, il faut se rfrer au manuel de rfrence, ou faire des tests... De plus, les direntes (f) -d]
versions d'une commande (par exemple la commande grep) ne reconnaissent pas le mme dsigne un  - ou un d.
ensemble d'expressions rgulires.
Attention  ne pas confondre les expressions rgulires qui ne sont reconnues que par
certaines commandes avec les expressions qui contiennent des caractres spciaux interpr- 11.2 Expressions rgulires reprsentant un ensemble d
ts par le shell (voir 4.5) et qui sont donc reconnues dans toutes les lignes de commandes.
caractres d'un seul type
4 partir des expressions rgulires correspondant  un seul caractre (et seulement
11.1 Expressions rgulires reprsentant un seul carac- partir de ces expressions), on peut construire les expressions rgulires suivantes :
tre * une expression ci-dessus suivie du caractre  * dsigne 0 ou plus occurrences de
caractres dsigns par l'expression. S'il y a plusieurs possibilits, l'expressio
Un caractre ordinaire se dsigne par lui-mme. Les expressions rgulires peuvent dsigne la plus longue cha ne  partir de la gauche qui permette de trouver un
aussi contenir des caractres spciaux. Les expressions rgulires suivantes dsignent un cha ne correspondant  l'expression rgulire. La signi cation de * dire don
seul caractre * elles sont reconnues par toutes les commandes : de la signi cation habituelle lors de l'interprtation des commandes par le shel
+ et ? certaines commandes, (mais pas toutes les versions de grep) donnent un sen
n suivi d'un autre caractre dsigne ce caractre. Il permet d'enlever le sens spcial
particulier aux caractres + et ? :
des caractres comme ., *,  et \.
! plac en dbut d'expression, dsigne un dbut de ligne. ? dsigne 0 ou 1 occurrence des caractres dsigns par l'expression qui prcde
$ plac en n d'expression, dsigne une n de ligne. + dsigne 1 ou plusieurs occurrences des caractres dsigns par l'expression qu
. (le point) dsigne n'importe quel caractre except le passage  la ligne (quiva- prcde.
lent de ? du langage de commande).
Pour les commandes qui ne reconnaissent pas le +, on peut le simuler * pa
1. cette commande n'est pas
tudi
e dans ce cours exemple,  xx* peut remplacer  x+.
60 CHAPITRE 11. EXPRESSIONS RGULIRES 11.3. AUTRES EXPRESSIONS RGULIRES 6
n{ et n} certaines commandes (mais pas toutes les versions de grep) permettent de don- Des possibilits supplmentaires sont utilises par certaines commandes et en particulie
ner encore plus de prcision sur le nombre d'occurrences : on peut faire suivre une par la commande awk (mais gnralement pas par ed ou grep) :
expression rgulire par (m et n sont des entiers compris entre 0 et 256) : expression1jexpression2
n{mn} pour indiquer exactement m occurrences dsigne une cha ne correspondant  la 1ere ou  la 2eme expression.
(...) les parenthses permettent de modi er l'ordre de priorit des oprateurs. L'ordr
n{m,n} pour indiquer au moins m occurences de priorit est  et ], puis *, + et ?, puis la concatnation et en n |.
n{m,nn} pour indiquer entre m et n occurrences (bornes comprises)
Exemples 11.2
(a) ^a-zA-Z]*
dsigne la plus longue cha ne de lettres  partir du dbut de la ligne * si la ligne
contient Bonjour Monsieur, c'est Bonjour qui est dsign.
(b) 0-9]\{3\}
dsigne un nombre de 3 chires.

11.3 Autres expressions rgulires


On peut construire des expressions rgulires  partir d'autres expressions rgulires :
concatnation
la concatnation d'expressions rgulires dsigne la concatnation des cha nes
dsignes par chacune des expressions rgulires.
Exemple 11.3
0-9]\{3\}A.*T$
dsigne une cha ne qui commence par 3 chires suivis de la lettre A et qui se termine
par la lettre T  la n de la ligne.
n(...n) et nn
Les commandes grep (cela dpend des versions) et awk permettent de dsigner
des sous-cha nes de caractres  l'aide des deux types d'expressions suivants :
n(expressionn) dsigne la mme chose que l'expression elle-mme (voir utilit
ci-aprs)
nn o- n est un entier dsigne la cha ne de caractres qui correspond  la nieme
expression entoure prcdemment par \( et \).
Exemples 11.4
(a) ^\(.*\)\1$
dsigne une ligne forme d'une cha ne rpte 2 fois.
(b) who | grep*'^\(a-z]\)^*]*\1*'
ache des informations sur les utilisateurs connects  la machine locale et dont le
nom de login commence et se termine par la mme lettre minuscule ( * dsigne un
espace).
62 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 12.2. CONCEPTS DE BASE 6
environnement X Window, emacs est lanc dans sa propre fentre X.
Le noyau d'emacs charge en mmoire de nombreux modules crits en elisp pour tendr
ses fonctionnalits. Il faut indiquer  l'diteur o- aller chercher ces modules. Si on ut
lise un seul diteur de la famille emacs, on peut utiliser la variable d'environnemen
EMACSLOADPATH. Pour cela, on ajoutera, par exemple, les lignes suivantes dans le chie

Chapitre 12 .zshrc (voir 15.3.2) :


export EMACSDIR=/usr/local/emacs-19.31
export EMACSLOADPATH=$HOME/emacs:$EMACSDIR/site-lisp:$EMACSDIR/lisp

diteur de texte (emacs, xemacs) Attention, emacs et xemacs utilisent des variantes direntes de certains modules. O
vitera d'utiliser la variable EMACSLOADPATH si on utilise les deux diteurs. Dans ce cas,
langage elisp permet de donner des valeurs direntes selon le type, et mme la versio
de l'diteur qui lit le chier .emacs. L'criture d'un chier .emacs ne fait pas partie d
ce cours * rcuprez des exemples dj crits de chiers .emacs et/ou lisez le manuel d
Pour crire des textes (programmes ou donnes) sous Unix, il faut disposer d'un pro- langage si vous tes intresss.
gramme qui permette d'entrer du texte et de le modi er sans tre oblig de tout retaper. Le chier .emacs du rpertoire HOME de l'utilisateur est excut automatiquement a
Les programmes qui font ce genre de travail s'appellent des diteurs de textes. Ils possdent dmarrage d'emacs. Si on ne veut pas qu'il s'excute (par exemple si ce chier contient de
de nombreuses commandes qui facilitent la t&che de l'utilisateur : recherche de cha nes de erreurs), on lance emacs avec l'option -q.
caractres dans un texte, remplacement automatique de cha nes par une autre, copie, sup-
pression de partie de texte, etc.
L'diteur emacs est un diteur pleine page trs puissant. L'diteur pleine page le plus
commun sous Unix est vi mais il est moins agrable  utiliser que emacs, moins puissant
12.1.2 Sortir de emacs
et moins souple. Sous X Window, le menu File permet de sortir de emacs.
Une caractristique essentielle de emacs est qu'il est possible (et pas trop complexe) de C-x C-c permet de sauvegarder (aprs demande de con rmation) les buers avant d
personnaliser son fonctionnement en aectant des valeurs  des variables d'environnement sortir.
ou mme en programmant des nouvelles fonctionnalits.
Nous ne donnerons ici que les commandes essentielles de emacs, susantes pour com-
mencer  crire des programmes et des textes simples sous Unix. La version dcrite est la
version 19 avec quelques ajouts pour la version 20. Cette dernire version ore de nom-
12.2 Concepts de base
breuses facilits pour travailler avec des langues non europennes et pour con gurer plus 12.2.1 Description d'une fentre emacs
simplement emacs.
xemacs est une version d'emacs plus graphique mais moins standard. Il possde beau- Une fentre ache par emacs est compose de :
coup de points en commun avec emacs mais certains points sont incompatibles. Nous ne
l'tudierons pas dans ce cours mais xemacs est disponible sur la plupart des machines de ) une barre de menus (seulement pour les versions sous graphiques en haut de la fentr
l'universit de Nice.
) la fentre de travail proprement dite o- s'ache le buer courant, sous la barre d
12.1 Entre et sortie menus,
) la ligne d'information, situe sous la fentre de travail,
12.1.1 Lancer emacs
emacs -q] fichier] & ) le mini-buer se trouve en bas de la fentre * il contient en gnral une seule lign
lance la version X Window de emacs. Comme tous les clients X, il faut lancer emacs en
arrire-plan pour garder la possibilit de travailler dans la fentre X d'origine. Dans un Dans la version X Window, un ascenseur borde la droite de la fentre de travail.
64 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 12.2. CONCEPTS DE BASE 6
Menus de la version graphique (X Window) indiques par C-M- dans le manuel s'obtiennent alors en tapant d'abord Esc] puis Ctr
et le caractre suivant (et non pas l'inverse).
Si on travaille dans l'environnement graphique (X Window, Windows 95 ou autre), le
haut de l'cran est occup par une ligne de noms de menus :
Buers permet de choisir son buer de travail Commandes emacs
File permet de charger, sauvegarder un chier, ouvrir une nouvelle fentre, imprimer Toutes les actions sous emacs sont excutes par des commandes dont le nom rappel
ou supprimer un buer, sortir de emacs le type de l'action excute :
Edit permet de copier, couper, coller, dfaire l'eet d'une commande, remplir avec le next-line
plus de mots possible les lignes d'une rgion (Fill) load-file
Help permet d'obtenir de l'aide sur emacs ou une commande Unix kill-word
De nombreux modes de travail (voir 12.2.5) modi ent ces menus ou ajoutent de nou- goto-line
velles entres. save-buffers-kill-emacs
L'utilisateur peut lancer ces commandes par leur nom en les pr xant avec M-x. Pa
Ligne d'information sur le mode de travail exemple,
M-x kill-word
La dernire ligne en bas de l'cran contient quelques indications utiles  l'utilisateur :
--**-Emacs : nom-buffer (mode majeur mineur)--L106--position--------
Les ** indiquent que le buer a t modi  (on peut aussi avoir %% qui indique que
le buer est  readonly). Associations de cls
mode majeur et mode mineur sont les modes de travail (voir 12.2.5).
 L106 dsigne le numro de la ligne courante. Les actions les plus couramment employes sont associes  des cls (combinaisons d
position peut tre All, Bot, Top ou nn% suivant que tout le texte est ach ou touches du clavier). Il sut de taper la cl pour lancer la commande associe. Voici deu
seulement la n ou le dbut, ou si nn% du texte est au dessus de la premire ligne ache. exemples :
Commande Cl
Mini-bu%er next-line C-n
save-buffers-kill-emacs C-x C-c
Les commandes tapes par l'utilisateur et les messages envoys par emacs sont achs
sous la ligne d'information dans une zone appele minibuer. Les autres commandes comme  goto-line doivent tre lances avec M-x.
On peut annuler une commande en cours et ache dans ce minibuer en tapant C-g. Les associations ( bindings) peuvent tre modi es (voir 12.4) et peuvent dpendre d
mode de travail (voir 12.2.5).
12.2.2 Commandes et associations de cls Complter automatiquement des noms de commandes
Touches spciales Certaines commandes ont des noms assez longs (par exemple goto-line). Il exist
emacs fait un grand usage de deux touches spciales notes C- et M- dans le manuel des facilits pour ne pas tre oblig de taper les noms en entier : on tape Tab] (touch
d'utilisation. de tabulation) ds que le nom de la commande peut se distinguer des autres noms d
C- dsigne la touche Ctrl]. Taper C-x revient  appuyer sur la touche Ctrl], et commandes * si on tape ESP] (barre d'espace), emacs complte un mot ds que ce mot s
 appuyer sur la touche x tout en gardant la touche Ctrl] enfonce. Le maintien sur la distingue des autres mots cls. Pour l'exemple de goto-line, il sut de taper g suivi d
touche Ctrl] est indiqu par le - qui suit le C. M- dsigne la touche Meta On l'utilise ESP] pour avoir goto- et l suivi de TAB]. Pour entrer une tabulation ou un espace,
de la mme manire que la touche Ctrl]. sut de les faire prcder de C-q.
Pour les claviers qui n'ont pas de touche Meta], la touche Alt] (ou la touche marque Si emacs ne peut complter parce qu'il y a plusieurs possibilits de compltions, il ach
d'un  } sur les claviers des machines Sun) joue souvent le mme rle. Sinon, on peut une fentre d'aide o- sont aches toutes les suites possibles. On peut alors parcourir cett
simuler M-x en tapant sur la touche Esc] avant de taper sur la touche x. Les commandes fentre par C-M-v. On peut choisir une des commandes en cliquant sur son nom avec
66 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 12.2. CONCEPTS DE BASE 6
bouton du milieu de la souris. Cette fentre se referme automatiquement quand on lance 12.2.4 Point d'insertion, marque, rgions
la commande complte.
De mme, les noms de chiers taps dans le mini-buer (par exemple pour donner Point d'insertion
le nom d'un chier  charger dans un buer) peuvent tre complts par emacs quand Le point d'insertion indique l'endroit o- les modi cations apportes au texte par l'ut
l'utilisateur tape la touche Tab] ou la barre d'espace. lisateur seront eectues (insertion de nouveaux caractres, suppression,...). Le point es
situ entre deux caractres. Il est indiqu sur l'cran par un curseur ach sur la positio
qui suit le point.
12.2.3 Buers et fentres Chaque tampon a un point d'insertion.
Tampon (ou bu%er)
Rgion
Chaque texte dit est conserv en mmoire centrale dans un buer. Plus gnrale-
ment, toute activit de emacs (aide en ligne, courrier lectronique, etc.) est eectue dans La rgion est la zone de texte comprise entre le point d'insertion et la marque.
un buer. La marque peut tre positionne dans le texte en tapant C-<barre d'espace>ou impl
On peut travailler avec plusieurs buers en mme temps. Chaque buer a un nom. Le citement par des manipulations de la souris.
nom d'un buer associ  un chier est le nom terminal du chier. Si on travaille avec C-x h met tout le texte du document comme rgion
plusieurs chiers qui ont le mme nom terminal, un numro est accol  la n du nom du M-h met tout le paragraphe comme rgion
buer.
Sous X Window, le menu Buers permet de choisir un buer. Utilisation de la rgion et de l'anneau de suppression
Plusieurs commandes permettent de manipuler une rgion (une zone de texte) et d
Fen&tre emacs l'enregistrer dans un anneau de suppression.
emacs conserve dans un anneau de suppression (commun  toutes les fentres) le
emacs ouvre une premire fentre au dmarrage. textes supprims par les commandes qui suppriment plus d'un seul caractre (C-k, C-
Par la suite l'utilisateur peut diviser cette fentre en plusieurs sous-fentres. Une fentre mais pas C-d, DEL] ou Backspace]). La commande M-w permet aussi d'ajouter des texte
emacs visualise une portion de buer et permet de travailler avec les donnes aches.  cet anneau sans les supprimer :
Deux fentres peuvent visualiser des portions direntes d'un mme buer ou visualiser C-w supprime la rgion (attention au w trompeur !) et la place dans l'anneau de sup
des buers dirents. pression
Le menu File permet de grer les fentres :  Split Window  pour dcouper la fentre M-w enregistre la rgion dans l'anneau de suppression
en cours en deux, ou  One Window  pour fermer toutes les fentres sauf une (pour cela, L'utilisateur peut ensuite rutiliser les textes ainsi conservs :
on peut aussi, dans les versions graphiques cliquer avec le bouton du milieu de la souris C-y colle le dernier texte plac dans l'anneau de suppression  l'endroit du poin
sur la ligne d'information de la fentre choisie). d'insertion
On peut accder  une fentre en cliquant avec le bouton gauche dans la fentre. M-y remplace le texte prcdemment coll par le texte plac juste avant dans l'annea
de suppression. On peut ainsi passer en revue tous les textes conservs jusqu'
trouver le texte que l'on veut.
Fen&tre X ('frame( dans le manuel en anglais) Dans un environnement X Window, on peut utiliser le menu Edit pour supprime
copier ou coller une rgion. On peut aussi utiliser la souris :
Sous X Window, l'utilisateur peut ouvrir une nouvelle fentre X pour y acher le buer Double-clic sur le bouton gauche
courant. Il peut ensuite y charger un autre buer ou y visualiser une autre partie du buer enregistre le mot point par la souris dans l'anneau de suppression
courant comme il le ferait pour une fentre emacs. Triple-clic sur le bouton gauche
Chaque fentre X possde son propre menu. enregistre la ligne pointe dans l'anneau de suppression
Pour ouvrir une nouvelle fentre X, le plus simple est d'utiliser le menu File, choix Bouton du milieu
Make New Frame. La fentre peut tre ferme par le mme menu, choix Delete Frame. colle  l'endroit du clic un texte prcdemment copi ou coup (idem C-y)
68 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 12.3. COMMANDES 6
Bouton droit C-k eace la n de la ligne (situe aprs le point) et la place dans l'anneau de sup
copie le texte plac entre le point et l'endroit du clic pour tre coll ensuite (idem M-w). pression
Si on clique 2 fois, le texte est coup au lieu d'tre copi (idem C-w).
Glisser (drag en anglais)
(c'est--dire, cliquer et se dplacer en maintenant un bouton de la souris enfonc) avec le Dplacer le point d'insertion
bouton gauche, du dbut  la n d'un texte, permet de d nir une rgion et de l'enregistrer
dans l'anneau de suppression. Les terminaux sont souvent con gurs pour que l'utilisateur puisse utiliser les 0che
pour se dplacer d'un caractre ou d'une ligne et les touches Next] et Prev] pour s
12.2.5 Mode de travail dplacer d'un cran.
Emacs permet de travailler en plusieurs modes de travail adapts au type de texte que On peut aussi utiliser les commandes ci-dessous :
l'on tape et au type de travail auquel ce buer est associ. Il existe par exemple un mode C-a va au dbut de la ligne
de travail pour crire un programme en langage C et des modes pour envoyer et recevoir C-e va  la n de la ligne
du courrier lectronique depuis emacs. M-< va au dbut du chier
Chaque fentre emacs a un mode de travail majeur en cours. M-> va  la n du chier
On peut aussi lancer des modes mineurs qui modi ent lgrement le fonctionnement Dans un environnement X Window,
des modes majeurs. Bouton gauche
Nous n'tudierons pas ces modes dans ce cours. Voici seulement une description rapide dplace le point  l'endroit du clic
du mode dired qui peut tre trs utile. On peut aussi utiliser la barre de d lement pour se dplacer.
On entre dans ce mode directory edition soit en ouvrant un chier rpertoire au
lieu d'un chier ordinaire, soit en appelant explicitement le mode par la commande M-x Barre de d lement ou 'ascenseur( (Scroll Bar)
dired-mode. Toutes les fentres X Window associes  emacs possdent une barre de d lemen
Ce mode est trs pratique pour se dplacer dans l'arborescence : on clique avec le bouton verticale  droite de la fentre. Cette barre reprsente tout le texte. Un rectangle intern
du milieu sur le nom du rpertoire o- l'on veut aller ou sur le chier que l'on veut charger plus ou moins long, reprsente la portion du texte actuellement ache.
dans un buer. Dans ce cas, l'achage se fait dans une deuxime fentre. Si on tape f On utilise la souris pour se dplacer dans le texte  l'aide de cette barre. Les utilisateur
sur la ligne qui contient le curseur, l'achage se fait dans la mme fentre. de Windows sur PC ou du Macintosh remarqueront que la manipulation de la barre d
On peut aussi copier et supprimer des chiers. On se reportera  l'aide en ligne d'emacs d lement est dirente sous emacs. Cette manipulation est identique  la manipulatio
et aux menus oerts par ce mode pour en savoir plus. des ascenseurs sous le client X Window xterm (voir cours sur X Window).
Bouton gauche
12.3 Commandes dplace en haut de la fentre la ligne en face de laquelle on a cliqu. Le texte est don
dplac vers la n du chier d'au plus un cran. Plus on clique bas, plus on avance dans
12.3.1 Commandes de base texte.
Bouton du milieu
Insertion dplace  l'endroit du clic le rectangle interne  la barre de d lement. Le texte ach es
Par dfaut emacs est en mode insertion : tout caractre non spcial (achable) tap est le texte correspondant  la position nouvelle du rectangle interne. Si on veut se dplace
insr  l'endroit du point. vers la n du chier, on clique donc sous le rectangle interne.
C-q permet d'insrer un caractre non achable tap  la suite On peut aussi cliquer sur le rectangle interne de l'ascenseur avec ce bouton et glisser pou
se dplacer contin.ment dans le texte.
Suppression Bouton droit
dplace  l'endroit du clic la ligne place en haut de la fentre. Le texte est donc dplac
Backspace supprime le caractre avant le point vers le dbut du chier d'au plus un cran. Plus on clique bas, plus on remonte dans
C-d supprime le caractre situ aprs le point (donc plac sous le curseur) texte.
70 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 12.4. PERSONNALISATION DE EMACS 7
Sauvegarder un chier 12.3.2 Autres commandes
Les chiers chargs dans un buer ne sont modi s que lorsque l'utilisateur indique Rechercher du texte
explicitement qu'il veut sauvegarder les modi cations qu'il a eectues sur le buer. C-s eectue une recherche incrmentale (les caractres sont recherchs au fur et
C-x C-s sauvegarde le buer courant mesure qu'ils sont taps) du texte tap vers la n du buer. Pour passer  l'occu
Sous X Window le menu File permet aussi de sauvegarder les chiers sous son nom rence suivante, on retape C-s. Pour arrter la recherche, on tape la touche Retur
actuel (Save Buer ) ou sous un autre nom (Save Buer As...). ou une commande de dplacement. On peut ensuite relancer la mme recherch
en tapant C-s C-s.
C-r eectue une recherche incrmentale vers le dbut du chier. Pour passer  l'oc
Remarque 12.1 curence suivante, on retape C-r.
L'ancienne version du chier (s'il ne s'agit pas d'un nouveau texte) est conserve sous C-M-s eectue la recherche d'une expression rgulire (voir chapitre 11).
l'ancien nom suivi du caractre  ~.
emacs eectue des sauvegardes automatiques  intervalles rguliers. Ces sauvegardes Remplacer une cha)ne de caractres par une autre
sont eectues dans des chiers dont le nom est le nom du chier modi  entour du M-% La question Query replace s'ache. On doit alors entrer la cha ne de caractre
caractre  #. Ces sauvegardes sont supprimes en cas de n d'dition normale. S'il y a eu  remplacer suivie de Return]. Il s'ache alors with et l'on entre la cha ne d
une sortie anormale d'emacs et si vous n'avez pu sauvegarder vos chiers, ces sauvegardes remplacement suivie de Return].
automatiques vous permettent de rcuprer les bonnes versions de vos chiers. De plus, A chaque fois que la cha ne  remplacer est rencontre, l'utilisateur peut ta
si vous voulez charger un des chiers qui n'a pu tre sauvegard normalement et si emacs per :
s'aper'oit qu'il y a un chier  # plus rcent que le chier que vous voulez charger, emacs y ou n pour remplacer ou non,
vous envoie le message Auto save le is newer* consider M-x recover- le. Vous pouvez q pour arrter de remplacer,
alors taper M-x recover- le et rcuprer automatiquement la version enregistre dans la ! pour tout remplacer jusqu' la n,
sauvegarde automatique. C-h pour avoir de l'aide sur la rponse

Aide 12.4 Personnalisation de emacs


Sous X Window, le menu Help permet d'accder aisment  toutes les aides nces- Le chier  ~/.emacs est excut au dmarrage de emacs. Il doit contenir du code Lisp
saires. Les amateurs clairs pourront consulter le manuel de programmation de emacs pour plu
de prcisions (environ 700 pages). On dispose aussi d'une description des variables et de
fonctions Lisp disponibles gr&ce au menu Help, Describe Function et Describe Variable
Dfaire (' undo() Certaines personnalisations ne sont pas diciles  eectuer, mme si l'on ne conna
pas le langage Lisp. Par exemple, les aectations de valeurs  des variables (on peut s'aide
Si l'utilisateur s'est tromp il peut annuler la plupart des commandes qu'il a tap. du menu Help Describe Variable) ou les associations de touches sont trs simples :
Sous X Window, il peut utiliser pour cela le choix Undo du menu Edit. (setq inhibit-startup-message t)
Il utile de noter que aecte la valeur t (true)  la variable inhibit-startup-message pour viter d'avoir
C-g sort du minibuer d'entre des commandes en annulant la commande que l'utili- message initial de emacs
(global-set-key find] 'isearch-forward)
sateur est en train de taper. associe la commande de emacs isearch-forward  la touche du clavier Find qui pourr
On peut ainsi se sortir d'un mauvais pas lorsqu'emacs vous ache continuellement ainsi tre utilise pour lancer une recherche. Les noms des touches reconnus par emacs son
le mme message dans le mini-buer parce que vous avez lanc une commande par une achs par la commande C-h k ou par le menu Help Describe Key.
mauvaise man8uvre. Il est alors souvent ncessaire de taper C-g, si ncessaire plusieurs
fois, et en se pla'ant avec la souris dans le minibuer si emacs s'entte. 1. Plus exactement, elisp, une variante du langage Lisp
72 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 7
Si une erreur survient lors de l'excution du chier  .emacs ou des dirents modules
appels, on peut visualiser les messages d'erreurs en allant dans le buer *Messages*. On
peut aussi valuer du code elisp d'un buer en mode Emacs-Lisp en tapant C-x C-e
avec le curseur plac juste derrire la parenthse fermante du code elisp.
Un grand nombre de packages crits en elisp par la communaut internationale des
utilisateurs d'emacs permettent d'ajouter de nombreuses fonctionnalits aux possibilits
de base oerte par la distribution ocielle d'emacs. On peut trouver la plupart sur le site ftp Chapitre 13
archive.cis.ohio-state.edu dans le rpertoire /pub/gnu/emacs/elisp-archive/packages.
Si on travaille sous X Window, on peut aussi personnaliser quelques caractristiques
de son environnement (couleurs, prsence d'un ascenceur sur les fentres X, etc.) avec les
chiers d'initialisation des ressources. Tapez  man emacs pour plus de prcisions 2.
Manipulation des donnes des
chiers
Depuis la version 20 un environnement minimum peut tre install pour tous les uti-
lisateurs d'emacs. Cet environnement est d ni dans les chiers site-load.el et site-start.el
(cherchez-les dans l'arborescence o- est installe la version 20 * les commandes locate ou
nd sont faites pour cela). Cet environnement, s'il vous convient vous permet de rduire 13.1 Tri (sort)
de fa'on signi cative la taille de votre chier .emacs. Si des options ne vous conviennent sort options] fichiers...]
pas, allez consulter ces chiers pour voir comment changer les choix qui y ont t faits.
trie les lignes des chiers (regroupes ensemble). La sortie se fait sur la sortie standard
Par dfaut, les lignes viennent de l'entre standard.
12.5 Complments pour les versions graphiques Les lignes sont tries selon la valeur d'une cl de tri forme d'une ou plusieurs zone
extraites de chaque ligne. Par dfaut le tri se fait sur les lignes entires selon l'ordre lex
Copier ou coller entre fen&tres X Window cographique (et selon le code ASCII) et selon l'ordre croissant par dfaut.
Quand un texte est copi ou coup (dans l'anneau de suppression) il peut tre coll Options pour indiquer la cl de tri :
dans une autre fentre X Window, mme s'il ne s'agit pas d'une fentre associe  emacs. +pos1 pos2 permet d'indiquer le dbut et la n d'une zone de la cl de tri. Le coup
Inversement, on peut coller dans emacs un texte prcdemment copi ou coup dans une +pos1 )pos2 indique que la zone de tri commence au champ numro pos
autre fentre X Window. + 1 et se termine au champ numro pos2 + 1 (attention, non compris !
S'il n'y a pas de )pos2, la zone de tri va jusqu' la n de la ligne. La notio
Choix de la police de caractres sous X Window de champ est d nie ci-dessous dans la d nition de l'option -t.
-tsparateur indique le caractre qui spare les dirents champs.
S-BD (Shift + bouton droit de la souris) ache un menu qui permet de choisir la police Si un sparateur n'est pas d ni, les champs sont spars par toute suit
utilise. On choisira plutt une police  espacement xe du type Courier 14 ou 7x14. d'espaces ou de tabulations contigus. Le premier caractre blanc est cons
dr comme un sparateur * les espaces et tabulations suivants font part
du champ suivant (voir option -b).
Il peut y avoir plusieurs cls de tri (voir exemple (b) ci-dessous).
-b ignore les espaces de tte dans chaque champ (-b est plac avant tous le
+pos1 ou b est accol derrire les +pos1 des champs pour lesquels cett
option est valable).
-n eectue un tri numrique (et non lexicographique) sur les cls. On peu
aussi accoler la lettre n derrire +pos1 si on ne veut trier numriquemen
que certains champs.
-f ignore la dirence entre majuscules et minuscules
2. La plupart des versions d'emacs ne sont pas
crites au-dessus de la bo te  outils Xt et tous les chiers Autres options :
de ressources ne sont pas utilis
s -c ache un message si les lignes ne sont pas dans le bon ordre (et dans ce ca
74 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.4. CONVERSION, SUPPRESSION DE CARACTRES (TR) 7
renvoie un code retour gal  1 au lieu de 0) ache le nombre de lignes, de mots, de caractres et le nom de chaque chier. Si des chier
-ochier sort le rsultat du tri dans chier. Attention  l'erreur suivante : ne sont pas spci s, l'entre standard est prise par dfaut.
sort chier > chier Options
qui dtruit chier avant de le trier (voir redirections en 14.2). La bonne -l nombre de lignes seulement
commande est -w nombre de mots seulement
sort -ochier chier -c nombre de caractres seulement
-r inverse l'ordre de tri. On peut aussi accoler la lettre r derrire +pos1 si on
Exemples 13.3
ne veut trier par ordre dcroissant que certains champs.
-u si plusieurs lignes ont la mme valeur pour la cl de tri, une seule de ces (a) Nombre de chiers de /bin :
lignes est envoye sur la sortie standard. ls -A /bin | wc -l

Exemples 13.1 (b) Compter les lignes, mots et caractres de tous les chiers du rpertoire courant don
(a) Tri de /etc/passwd sur le numro de l'utilisateur : le nom commence par b :
sort -t: +2n -3 /etc/passwd wc b*
Le tri ne se fait pas correctement si on oublie le n  la suite de +2.
(b) Tri les chiers du rpertoire courant par taille et par nom pour les chiers qui ont la
mme taille :
13.4 Conversion, suppression de caractres (tr)
ls -lgA | sort +4n -5 +8 La commande tr permet de convertir ou de supprimer des caractres provenant d
l'entre standard.
Conversion de caractres
13.2 Recherche d'une chane de caractres (grep) tr -cs] chane1 chane2
transforme les caractres provenant de l'entre standard ainsi : les caractres contenus dan
grep options] expr-reg fichiers...] chane1 sont transforms en les caractres correspondants de chane2 et les autres caractre
ache sur l'cran les lignes des chiers, qui contiennent une cha ne de caractres corres- sont conservs tels quels. Le tout est envoy vers la sortie standard.
pondant  l'expression rgulire expr-reg (voir chapitre 11. L'entre standard est prise par Si chane2 contient moins de caractres que chane1, le dernier caractre de chane
dfaut si des chiers ne sont pas spci s. Le code retour renvoy est 0 si l'expression remplace les caractres manquants.
rgulire a t trouve ou 1 sinon. On peut dsigner un caractre par son code ASCII en octal prcd par n. On peu
Si expr-reg comporte des caractres spciaux pour le shell (* ou  par exemple), il ne dsigner un intervalle de caractres : e-l dsigne les lettres minuscules comprises entre
faut pas oublier de les protger en les entourant d'apostrophes ou de guillemets (voir 14.8). et l (bornes comprises). En Unix systme V, la syntaxe est plutt e-l].
Options
-c ache seulement le nombre de lignes contenant la cha ne Exemples 13.4
-i ignore la dirence entre minuscules et majuscules ( > est le prompt dans les exemples suivants)
-n ache les numros des lignes
-v ache les lignes qui ne contiennent pas la cha ne ~> tr aeiou AEIOU
bonjour
Exemple 13.2 Ctrl] D
grep -c '^bin' fichier
ache le nombre de lignes de chier qui commencent par bin. bOnjOUr
(b)
(a) ~> tr "a-z" "A-Z"

13.3 Compter les caractres, les mots, les lignes (wc) abcd
Ctrl] D
wc options...] fichiers...] ABCD
76 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.5. FRACTIONNEMENT VERTICAL (CUT) 7
(c) cat toto | tr ae AE > totobis (c) -5,8
ou dsigne les caractres situs en position 1  5 et 8
tr ae AE > totobis < toto
(d) 3-
Options dsigne les caractres situs en position 3  la n de la ligne
-c prend pour chane1 le complment de la chane1 indique dans la commande. Le
complment est pris par rapport  l'ensemble des caractres de code 0  255. (e) 12-20,4-15
-s (squeeze) ne garde en sortie qu'un seul exemplaire d'une suite d'un mme carac- dsigne les caractres situs en position 4  20
tre de chane2. Les caractres seront toujours achs dans l'ordre qu'ils ont sur la ligne du chier, qu
Exemple 13.5 que soit l'ordre donn dans la liste (voir exemple b ci-dessous).
tr -cs a-zA-Z '\012'
ache l'entre au clavier, un mot (cha ne compose uniquement de lettres) par ligne Exemples 13.8
(\012 est le caractre passage  la ligne de code 10 en dcimal, 012 en octal). (a) cut -c-5,10-15 fichier1 fichier2
extrait les 5 premiers caractres et les caractres 10  15 de chaque ligne de fichier
Suppression de caractres et de fichier2 et les ache sur l'cran
tr -d chane
envoie vers la sortie standard les caractres re'us dans l'entre standard s'ils ne sont pas (b) cut -c10-12,4-11 fichier
inclus dans cha ne. tr supprime au passage tous les caractres inclus dans cha ne. extrait les caractres 4  12 de chaque ligne. On remarquera que les caractres 10 e
11 ne sont achs qu'une seule fois.
Exemple 13.6 cut -fliste -ddlimiteur] -s] fichiers...]
~> tr -d ac
abcad dans ce cas le dcoupage se fait sur des champs (comme l'indique l'option  -f) dlimite
Ctrl] D
par dlimiteur (option  -d * tabulation par dfaut).
bd Attention, si plusieurs dlimiteurs sont accols, ils d nissent plusieurs champs. C'es
~>
une source frquente d'erreurs quand le dlimiteur est la tabulation ou l'espace. Quand o
veut extraire des champs spars par un ou plusieurs espaces il est prfrable d'utiliser l
commande awk (voir 13.10).
13.5 Fractionnement vertical (cut) Les lignes sans dlimiteur sont conserves en entier. L'option -s indique qu'il ne fau
pas conserver les lignes sans dlimiteur.
cut -cliste fichiers...] liste est une liste de nombres entiers spars par des virgules avec ventuellement de
dcoupe un ou plusieurs chiers (entre standard par dfaut) verticalement en slection- tirets pour indiquer un intervalle. Le dcoupage se fait sur les numros de champs (
nant des intervalles de caractres (comme l'indique l'option  -c)  conserver dans chaque premier champ a le numro 1). Cette liste indique quels seront les champs qui seron
ligne. Le rsultat est envoy sur la sortie standard. conservs sur chaque ligne.
liste est une liste de nombres entiers spars par des virgules avec ventuellement des Les caractres seront toujours achs dans l'ordre qu'ils ont sur la ligne du chier, qu
tirets pour indiquer un intervalle. Le dcoupage se fait sur les numros de caractres (le que soit l'ordre donn dans la liste.
premier caractre a le numro 1). Cette liste indique quels seront les caractres qui seront Exemples 13.9
conservs sur chaque ligne. (a) cut -f1,5 -d: /etc/passwd
Exemples 13.7 ache les utilisateurs et le commentaire associ du chier /etc/passwd
(a) 1,3,8 (b) Compter combien il y a de clients distincts dans un chier de factures dont chaqu
dsigne les caractres situs en position 1, 3 et 8 ligne correspond  un client plac en tte de ligne (tabulation entre chaque zone d'un
(b) 2-5,10
ligne) :
dsigne les caractres situs en position 2  5 et 10 cut -f1 factures | sort -u | wc -l
78 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.7. TRAITER LES LIGNES CONSCUTIVES IDENTIQUES (UNIQ) 7
13.6 Comparaison du contenu de 2 chiers Exemple 13.11
$ cmp fich1 fich2
13.6.1 Dirences entre deux chiers texte (di) fich1 fich2 differ : char 160, line 5

diff -e] fichier1 fichier2


indique quelles lignes doivent tre changes dans chier1 pour qu'il soit identique  chier2. 13.7 Traiter les lignes conscutives identiques d'un
Les deux chiers doivent tre de type texte, structurs en lignes (voir 1.6.2).
On peut ainsi comparer deux versions d'un mme chier.
chier (uniq)
Le rsultat n'est pas toujours facile  comprendre. La lettre a indique que des lignes ont uniq -cdu] fichier]
t ajoutes  chier2 par rapport  chier1, d indique que des lignes ont t supprimes, n'ache qu'un seul exemplaire des lignes de chier] (entre standard par dfaut). Si plu
c que des lignes ont t changes. Les nombres avant la lettre sont des numros de lignes sieurs lignes conscutives sont identiques, une seule est envoye vers la sortie standard
de chier1 et les numros qui suivent la lettre sont des numros de lignes de chier2. Les Cette commande ne considre pas deux lignes identiques si elles ne sont pas conscutive
lignes de chier1 sont prcdes de  <, celles de chier2 sont prcdes de  >. (il faut faire un tri pralable si on veut les prendre en compte).
Option
Exemple 13.10 -c ache chaque ligne en un seul exemplaire, en la faisant prcder du nombre d
~> cat f1 lignes voisines identiques
ab -d n'ache que les lignes identiques (en un seul exemplaire)
c -u n'ache que les lignes en un seul exemplaire
e

13.8 Extraire le dbut ou la n d'un chier


fg
h
~> cat f2
ab 13.8.1 Dbut d'un chier (head)
e
head -n] fichiers...]
f
u
sort sur la sortie standard les n premires lignes de chacun des chiers (de l'entre standar
~> diff f1 f2
par dfaut). Par dfaut, n est gal  10.
2d1 Exemple 13.12
< c head -5 fich*
4,5c3,4
< fg
< h
13.8.2 Fin d'un chier (tail)
--- tail dbut] fichier]
> f copie la n du chier sur la sortie standard.
> u La premire ligne ache est indique par dbut qui peut tre +n (neme ligne du chier
ou )n (neme ligne  partir de la n du chier).
n peut aussi tre suivi des lettres b ou c qui indiquent que l'on compte en blocs ou e
13.6.2 galit du contenu de 2 chiers (cmp) caractres et non pas en lignes.
cmp -s] fichier1 fichier2 Si le chier n'est pas indiqu, tail prend l'entre standard par dfaut.
ache le premier octet dirent dans les 2 chiers. Exemples 13.13
Option (a) tail +120 fich
-s cmp n'ache rien mais retourne seulement un code de retour (voir 14.1.6) : 0 si
les 2 chiers sont identiques, 1 s'ils sont dirents et 2 s'il y a eu une erreur. (b) tail -2b fich
80 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.10. UN LANGAGE D'DITION DE FICHIERS (AWK) 8
13.9 Un diteur non interactif (sed) aucune adresse
qui dsigne toutes les lignes.
13.9.1 Description gnrale de l'diteur
sed est un diteur non interactif de chier : il lit les donnes provenant d'un chier (ou 13.9.4 Excution du programme
de l'entre standard par dfaut), les traite suivant un programme et sort le rsultat du sed applique chaque commande du programme  la premire ligne du chier trait.
traitement sur la sortie standard. passe ensuite  la ligne suivante et ainsi de suite.
sed est souvent utilis comme ltre dans un pipe. Chaque commande s'applique  la version de la ligne courante dj modi e par le
Comme pour la commande awk vue  la section suivante, nous ne verrons qu'une petite commandes dj excutes sur cette ligne.
partie des possibilits oertes par cette commande.
sed -n] -e commande fichiers...]
copie les chiers (l'entre standard par dfaut) sur la sortie standard aprs avoir eectu le
13.9.5 Commandes
traitement indiqu dans commande. commande doit tre un mot pour le shell (donc entour Les commandes les plus utilises sont
de guillemets ou d'apostrophes s'il contient des espaces). Il peut y avoir plusieurs options
-e. S'il n'y en a qu'une, -e est optionnel. s pour substituer une cha ne de caractres  une autre,
sed -n] -f fichier-pgm fichiers...] d pour supprimer des lignes,
indique que le programme est enregistr dans un chier.
L'option -n indique que les lignes lues ne doivent pas tre automatiquement renvoyes p pour envoyer des lignes vers la sortie standard.
sur la sortie standard aprs leur traitement. Seules les lignes explicitement envoyes par la
commande p ou une commande similaire le seront (il faut par exemple ajouter l'option p On peut regrouper plusieurs commandes avec { et }.
de la commande s). Exemple 13.14
Une grande partie des traitements eectus par sed peut tre excute par awk. awk est for dir in `echo $PATH | sed -e 's/:/ /g'`
plus puissant mais sed est plus simple d'emploi pour remplacer une cha ne de caractres do .........
par une autre (commande s).
Une grande partie des traitements eectus par sed peut tre excut par awk. awk es
plus puissant mais sed est plus simple d'emploi pour certaines t&ches, en particulier pou
13.9.2 Structure d'une ligne de programme remplacer une cha ne de caractres par une autre (commande s).
lignes commande arguments
On remarquera que le chier trait n'est pas modi  par sed. Si on veut modi er u
lignes indique les lignes sur lesquelles la commande sed sera applique. L'argument permet chier de fa'on non interactive, le plus simple est d'utiliser l'diteur ed avec un chie
de prciser le traitement  eectuer sur les lignes. inclus (voir 16.4.1 * la commande s y est dtaille).

13.9.3 Format pour indiquer les lignes  traiter 13.10 Un langage d'dition de chiers (awk)
Les lignes sont numrotes de 1 au nombre de lignes re'ues. 13.10.1 Description gnrale de la commande
L'adresse d'une ligne peut tre dsigne par un numro de ligne, par $ (dernire ligne)
ou par une expression rgulire entoure de /. awk 1 lit un texte contenu dans un ou plusieurs chiers, le modi e et envoie le rsulta
Les lignes traites peuvent tre dsignes par : vers la sortie standard.
adresse1, adresse2 awk est une commande trs puissante pour travailler sur le contenu d'un chier. Elle po
qui dsigne un ou plusieurs blocs de lignes comprises entre les lignes dsignes par les deux sde un langage de programmation comportant des structures conditionnelles, des boucle
adresses et des fonctions prd nies * ce langage peut travailler avec des variables et des tableaux
adresse Nous n'tudierons ici que les fonctionnalits les plus simples oertes par awk.
qui dsigne toutes les lignes correspondant  l'adresse 1. du nom de ses d
veloppeurs Aho, Weinberger et Kernighan
82 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.10. UN LANGAGE D'DITION DE FICHIERS (AWK) 8
Il est fortement conseill d'tudier plus en dtail cette commande si l'on veut eectuer Une ligne d'un programme a la structure suivante :
des traitements complexes sur le contenu des chiers. Un langage encore plus puissant est slecteur { action }
fourni par le langage Perl qui ne sera pas tudi ici. slecteur indique si action doit tre excute sur l'enregistrement en cours de traitement
Le traitement  eectuer est crit dans un programme tap directement dans la ligne Dans ce cours nous ne verrons que les programmes comportant une seule ligne qu
de commande (forme 1 de la syntaxe) ou enregistr dans un chier (forme 2 de la syntaxe). ache (par la commande print) des portions de lignes du chier trait.
awk -Fc] programme fichiers...] Les constantes de type cha ne de caractres sont entoures par des guillemets.
ou On peut inclure des commentaires dans une ligne du programme en les faisant prcde
awk -Fc] -f fichier-programme fichiers...] du caractre #.
L'option -F permet d'indiquer le sparateur de champ (voir13.10.2).
Pour la premire forme de la syntaxe, le programme doit tre considr comme un seul 13.10.4 Cas particuliers pour une ligne de programme
mot par le shell * en gnral, il est donc ncessaire de l'entourer par des apostrophes ou
des guillemets. ) S'il n'y a pas de slecteur, action est toujours excute (pour tous les enregistrements
Excution de la commande :
awk travaille sur des enregistrements constitus de champs. Le sparateur d'enregistre- Exemple 13.16
ment tant par dfaut le sparateur de ligne de Unix, awk travaille ordinairement sur des ls -lg | awk ' { print $9, $5 }'
lignes. ache le nom et la taille (les neuvime et cinquime champs de la ligne) de
awk lit enregistrement par enregistrement les donnes des chiers (l'entre standard chiers du rpertoire courant.
par dfaut). Chaque enregistrement est trait  son tour selon les indications donnes par ) S'il n'y a pas d'action, l'enregistrement trait est recopi vers la sortie s'il a t
toutes les instructions du programme, avant la lecture de l'enregistrement suivant. slectionn par slecteur.
13.10.2 Champs Exemple 13.17
L'exemple de 13.18 pourrait donc s'crire plus simplement.
Quand awk lit un enregistrement d'un chier, il l'clate en champs spars par des ls -l | awk '/^d/'
espaces ou des tabulations (par dfaut) ou par le caractre suivant l'option -F.
Le programme peut faire rfrence  un ou plusieurs champs de la ligne lue :
$1, $2,... 13.10.5 Slecteurs
reprsentent les 1er  2eme ,... champs Ils peuvent tre du type :
$0
reprsente la ligne entire. ) /expression rgulire/
Exemples 13.15 Dans ce cas, action sera excute sur un enregistrement s'il contient une cha ne d
(a) Acher le nom, les autorisations et le propritaire des sous-rpertoires du rpertoire caractres qui correspond  expression-rgulire (voir 11).
courant : Exemple 13.18
ls -lg | awk '/^d/ { print $9, $1, $3 }' ls -l | awk '/^d/ { print }'
ache toutes les lignes de 
ls -l  concernant les sous-rpertoires du rpertoir
(b) Acher les noms des utilisateurs : courant.
awk -F: '{print $1}' /etc/passwd
) expression de comparaison (semblables  celles du Langage C) :
13.10.3 Structure d'un programme ==, !=, <, >, <=, >=
Un programme peut tre complexe et comporter de nombreuses lignes incluant toutes De plus, ~ (tilde) permet de comparer une cha ne de caractres  une expressio
les structures de programmation que l'on trouve habituellement dans les langages de pro- rgulire (place entre deux /). Par exemple,
grammation comme le langage Pascal ou le langage C. $5 ~ /^0-9]/
84 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.10. UN LANGAGE D'DITION DE FICHIERS (AWK) 8
) expression compose des deux types prcdents relis par des oprateurs logiques Pour une description plus dtaille, on se reportera au manuel de rfrence ou, encor
|| (ou), && (et), ! (ngation de l'oprateur qui suit)
mieux,  un guide d'utilisation de awk.
Des exemples d'utilisation des instructions de contrle sont donns dans la sectio
) mots cl BEGIN ou END. Si le slecteur de la premire (resp. dernire) ligne du suivante.
programme est BEGIN (resp. END), l'action de cette ligne sera excute une fois Voyons un peu plus en dtails print et printf :
avant (resp. aprs) de traiter le premier (resp. dernier) enregistrement des chiers. >
print expressions...]  fichier]
Des exemples d'utilisation de ces mots cls sont donns en 13.11. ou
print expressions...]  >>
fichier]
Exemples 13.19 ache les expressions sur la sortie standard ou vers le chier ventuellement spci  e
(a) $2 == "" redirection. print eectue ensuite un passage  la ligne.
Si les expressions qui suivent print sont spares par un ou plusieurs espaces, elle
(b) $2 == "1" || $2 =="5" sont sorties accoles les unes derrire les autres. Si elles sont spares par une virgule, elle
sont sorties spares par un espace.
(c) $2 !~ /^ab/ # deuxieme champ ne commence pas par ab On peut ajouter un pipe en sortie de print. La commande Unix qui re'oit ce qui es
envoy par print doit tre entoure de guillemets.
(d) $2 > 3 print (seul) ache l'enregistrement complet.
(e) /^$/ # ligne vide
Variables utilisateur
Le format gnral d'un programme est donc : Des variables peuvent tre utilises dans les programmes. La syntaxe de leur utilisatio
BEGIN { instruction de d-but }
s-lecteur { action }
est semblable au Langage C. Les variables sont initialises  la cha ne vide. Les variable
....
qui sont utilises dans des calculs sont automatiquement initialises  0.
.... Exemple 13.20
s-lecteur { action } Acher la taille totale des chiers achs par la commande ls :
END { instruction de fin }

ls -lg |
13.10.6 Actions awk ' { print $9, $5
somme = somme + $5 }
Une action est une suite d'instructions. Comme en Langage C plusieurs actions peuvent END { print "Total des tailles des fichiers :", somme }'
tre regroupes entre accolades. Une instruction se termine par un *, un passage  la ligne
ou par une accolade fermante. Remarque 13.1
Une instruction peut tre une instruction de contrle, une aectation, print ou printf. Les constantes cha nes de caractres doivent tre entoures par des guillemets sino
Les instructions de contrle disponibles sont : elles sont considres comme des noms de variables par awk. C'est une source d'erreu
if, while, for, break, continue, next, exit. frquente lorsque l'on commence  programmer avec awk.
L'instruction next fait passer directement au traitement de la ligne suivante.
Pour les autres instructions, la syntaxe est semblable  celle du langage C. Les instruc- Variables systme
tions composes de plusieurs instructions sont entoures d'accolades :
{ if (n > 1000) { Voici quelques variables systme utilises par awk :
i++ NF nombre de champs de la ligne
somme += $4 NR nombre de lignes qui ont t lues
} FS sparateur de champs en entre (par dfaut l'espace ou la tabulation)
} OFS sparateur de champs en sortie (par dfaut l'espace)
86 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.11. EXEMPLES DE PROGRAMMES 8
RS sparateur d'enregistrements (line feed de code 10 par dfaut). ) Acher le nom et la taille des chiers du rpertoire courant avec un format de sort
 RS="" indique que le sparateur d'enregistrement est la ligne vide. C'est plus agrable (le nom cadr  gauche dans un champ de 20 caractres et la tail
utile pour travailler avec des enregistrements multi-lignes. cadre  droite dans un champ de 6 caractres) :
FILENAME nom du chier en cours de traitement ls -alg | awk '{ printf "%-20s %6d\n", $9, $4 }'
FS, OFS et RS sont modi ables par le programme.
) Acher les lignes qui contiennent ab ou cde :
13.10.7 Fonctions, oprateurs awk '/ab/ || /cde/'

On peut utiliser des fonctions (de syntaxes semblables aux fonctions du Langage C) ) Acher tous les intervalles de lignes qui sont incluses entre deux lignes gales
dans les slecteurs et les actions. debut et   n :
Pour faire des calculs : awk '/^debut$/,/^fin$/'
int, sqrt, log, exp, int,...
Pour travailler avec des cha nes de caractres : ) Acher les lignes dont le premier champ est dirent de celui de la ligne prcdente
substr, length, index,... awk '$1 != prev { print # prev = $1 }'
La fonction getline permet de lire une ligne ou la valeur d'une variable :
getline lit une ligne du chier en cours. ) Voici un chier programme adjacents que l'on peut appeler par
getline variable  lit une ligne du chier en cours et met la valeur dans variable. awk -f adjacents fichier
On peut spci er en entre un autre chier pour getline par une redirection de l'entre : pour reprer les mots adjacents identiques dans un chier :
getline variable ] < chier 
La valeur lue par getline peut aussi provenir d'une commande Unix : NF>0 {
 commande j getline variable ] if ($1 == derniermot)
Pour lancer une commande Unix, on dispose de la fonction  system . Par exemple, print "double %s, ligne %s\n", $1, NR
system("rm fichier") for (i=2 # i<=NF # i++)
On peut utiliser aussi des calculs avec les oprateurs du langage C : if ($i == $(i-1))
+, -, *, /, %, ++, ), +=, *=, /= et %= printf "double %s, ligne %s\n", $i, NR
if (NF>0)
Exemple 13.21 derniermot = $NF
length($0) > 72 { print "Ligne", NR, "longue:", substr($0, 1, 72)}
}
Les versions nawk et gawk ont les fonctions gsub et sub qui permettent de remplacer
une cha ne de caractres par une autre dans les lignes du chier. ) Acher les groupes auxquels l'utilisateur appartient :
awk -F: /:,]`logname`'($|,)/{ printf "%s\n", $1 }' /etc/group

13.11 Exemples de programmes Remarquez l'expression  ($|,) qui indique que le nom d'utilisateur est suivi pa
une virgule ou par la n de la ligne.
) Acher le nombre de lignes du chier :
) Plier les lignes qui ont plus de 50 caractres dans un chier (on ajoute un \  droit
awk 'END { print NR }' fichier des lignes plies :
) Acher le premier et le dernier champ de chaque ligne : length($0) > 72 {
awk '{ print $1, $NF }' fichier print substr($0,1,50) "\\"
ligne = substr($0,51)
) Acher le nom et la taille des chiers du rpertoire courant : while (length(ligne) > 50) {
ls -alg | awk '{ print $9, $3 }' print substr(ligne,1,50) "\\"
88 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 8
ligne = substr(ligne,51)
}
print ligne
}
length($0) < 72

13.12 Tableaux
awk peut manier des tableaux dont les indices ne sont pas ncessairement des entiers.
Voici un exemple de programme utilisant un tableau pour additionner toutes les valeurs
correspondant  des noms d'un chier de la forme :
toto 100
bibi 200
toto 150
jean 200 Troisime partie
toto 300
bibi 150
Le programme achera :
toto 550
Mcanismes d'interprtation du shell
bibi 350
jean 200
Voici le programme :
{ somme$1] += $2 }
END { for (nom in somme) print nom, sommenom] }
Remarquez le 
for (nom in somme)  qui parcourt le tableau.
On peut utiliser l'lment d'un tableau comme condition d'un if. Dans ce cas, la condi-
tion est vraie si l'indice correspond  un lment qui a re'u une valeur dans le programme :
{ if (valeur$1]) print $1, "a deja une valeur" }
La fonction split permet de dcouper une cha ne de caractres en aectant chaque
champ de la cha ne aux lments d'un tableau.

13.13 D'autres commandes de manipulation de chiers


split Fractionnement horizontal d'un chier en chiers de tailles xes (on peut
recoller les morceaux par cat)
csplit Fractionnement horizontal d'un chier selon le contenu des lignes du chier
(on peut recoller les morceaux par cat)
fold dcoupe les lignes trop longues en plusieurs lignes
paste Recollement vertical (en colonnes) de plusieurs chiers (le contraire de cut)
comm Slection/rejet de lignes communes  2 chiers
join Jointure sur une zone commune (au sens des bases de donnes relationnelles)
de 2 chiers tris suivant cette zone
9

Chapitre 14
Interprtation du shell. Mcanismes de
base
14.1 Gnralits sur le shell
14.1.1 D nition
Quand l'utilisateur tape son nom et son mot de passe, le programme de dmarrag
associ  l'utilisateur (voir 2.1.1) est automatiquement lanc. Ce programme est le plu
souvent un shell et toute la session de l'utilisateur se droule en fait dans ce shell.
Quand une commande est tape au clavier, le programme shell la lit, l'interprte e
lance son excution. La ligne tape au clavier peut ne comporter qu'un nom de command
mais elle peut aussi tre beaucoup plus complexe car le shell comprend un vritable langag
de programmation qui apporte beaucoup de souplesse et de puissance  l'utilisateur.
L'utilisateur peut d'ailleurs crire des programmes dans le langage du shell et les enre
gistrer dans des chiers appels shellscripts (voir 14.11).

14.1.2 Compatibilit des dirents shells


Nous travaillerons avec le shell zsh. Sous ce shell les shellscripts sont excuts par le she
sh sauf mention contraire explicite du programmeur. Le shell standard est actuellemen
ksh.
Nous tudierons donc essentiellement les commandes communes  sh,  ksh et  zsh, e
indiquant les cas o- les shells ne fonctionnent pas exactement de la mme fa'on.
Autant que possible on essaiera de n'utiliser que les commandes et possibilits oerte
par tous les shells quand on crira un shellscript, pour favoriser sa portabilit. En interacti
le problme ne se pose pas et on pourra utiliser toutes les facilits du shell avec lequel o
travaille.
Les shells peuvent tre con gurs de direntes fa'ons selon les valeurs d'options qu
l'on peut donner, soit  l'appel du shell, soit par la commande set (le plus souvent lanc
dans un chier d'initialisation du shell * voir 15.3). Par exemple,
92 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.2. REDIRECTIONS 9
zsh -o NOCLOBBER Cet environnement peut guider les commandes pendant leur excution. Par exemple, l
ou commande lpr envoie les requtes d'impression vers l'imprimante dont le nom est conten
set -o NOCLOBBER dans le variable PRINTER si cette variable fait partie de l'environnement.
positionne l'option NOCLOBBER (voir 14.2.1) au dmarrage ou durant une session de zsh.
Pour avoir une bonne compatibilit de zsh avec ksh et sh, il faut positionner l'option 14.1.6 Code retour d'une commande
NO_NOMATCH (voir 4.5) et ne pas positionner les options GLOBDOTS et NOCLOB-
BER. Dans ce cas, l'incompatibilit principale de zsh avec les autres shells provient de la Toute commande Unix renvoie un code retour.
fa'on d'indiquer la ngation de caractres pour la gnration des noms de chiers : ! ] En gnral, le code retour est gal  0 si tout s'est bien pass et  un entier strictemen
pour sh et ksh et ^ ] pour zsh. positif sinon. Il permet d'automatiser des t&ches  l'aide de shellscripts en tenant compt
des rsultats des commandes comme nous le verrons dans le chapitre 17.
14.1.3 Commandes et processus, commandes internes au shell Remarque 14.1
Suivant les cas, une ligne tape au clavier peut lancer aucun, un ou plusieurs nouveaux Ce code retour ne s'ache pas 1 * il est enregistr dans la variable  ? du she
processus (voir 2.2) : (voir 15.2.6). Il peut tre ach par la commande  echo $?.
) La plupart des lignes de commandes tapes par l'utilisateur entrainent l'excution La touche d'annulation (souvent Ctrl] C * voir 3.3) permet d'interrompre l'excutio
d'un chier binaire enregistr dans l'arborescence des chiers. Le shell lance l'ex- d'une commande si elle n'a pas t lance en arrire-plan. Le code retour est alors en gnra
cution de ce chier aprs avoir interprt la ligne de commande. Cette excution dirent de 0 (cela dpend de la manire dont a t crite la commande * voir command
engendre un nouveau processus. interne trap en 17.5).
) Certaines lignes de commandes peuvent engendrer plusieurs processus (par exemple
les lignes de commandes comportant un pipe). 14.2 Redirections
) D'autres commandes sont internes au shell * le shell sait les excuter sans faire appel Avant de lancer un processus, le shell 2 lui associe 3 chiers :
 un chier externe et aucun nouveau processus n'est engendr. Ces commandes sont
peu nombreuses : essentiellement cd et pwd dans les commandes les plus courantes. Entre standard (par dfaut le clavier) * le descripteur de chier est 0.
Sortie standard (par dfaut l'cran) * le descripteur de chier est 1.
14.1.4 Prompts
Le shell indique qu'il est prt  prendre une nouvelle commande en achant le prompt
Erreur standard (par dfaut l'cran) * le descripteur de chier est 2.
(par dfaut le prompt est $ ). Ces 3 descripteurs peuvent tre lis  d'autres chiers que ceux indiqus ci-dessus gr&c
Une commande se termine par un passage  la ligne. Dans certains cas le passage  la aux commandes de redirection. Le shell va associer d'autres chiers que le clavier ou l'cra
ligne n'est pas considr comme un terminateur de commande par le shell * dans ces cas, il  ces 3 descripteurs et il lancera ensuite la commande.
s'ache un deuxime prompt ( >  par dfaut) pour indiquer que le shell attend la suite
de la commande :
$ echo "LIGNE 1
14.2.1 Redirections de la sortie standard
> LIGNE 2" Redirection avec crasement du chier de redirection (>)
LIGNE 1
LIGNE 2 On redirige la sortie standard d'une commande dans un autre chier que le chie
spcial associ  l'cran, par la redirection
>chier
14.1.5 Environnement d'une commande ou d'un shellscript
1. Sous zsh, l'option print_exit_value fait acher le code retour s'il est di
rent de 0
Toutes les commandes lances dans Unix s'excutent dans un environnement de travail 2. C'est une convention adopt
e par tous les shells et par l'immense majorit
des programmes
cri
d ni par un ensemble de variables (voir chapitre 15). pour Unix
94 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.3. PIPE (j) 9
Cette redirection associe le chier chier au descripteur 1. Tout ce qui est envoy vers 14.2.5 Pseudo- chier /dev/null
la sortie standard (connue par la commande comme le chier de descripteur 1) est donc Le chier spcial de type caractres (voir 1.6.2) /dev/null est un pseudo- chier qu
envoy  chier. La redirection doit tre crite  la suite de la commande sur laquelle elle valent  un puits sans fond.
agit.
Si chier existait dj, son contenu est cras * s'il n'existait pas, il est cr. Il est souvent utilis avec les redirections, en particulier pour ignorer les message
d'erreur :
Remarque 14.2 find /students -name core -print 2>/dev/null
Avec zsh (et ksh ), le comportement en cas d'existence de chier dpend de la valeur
de l'option NOCLOBBER (voir 14.1.2). Si cette option est mise, le chier ne sera
pas cras et zsh achera un message d'erreur. Dans ce cas, pour indiquer que l'on 14.3 Pipe ( ) j
souhaite craser un chier s'il existe dj, il faut utiliser le signe de redirection  >!
Les donnes de sortie d'une commande peuvent tre directement utilises comme don
Exemples 14.1 nes d'entre d'une autre commande gr&ce au symbole  |. En eet, la sortie standard d
(a) ls - l > fich
la commande de la commande place avant le  | est redirige vers l'entre standard de l
commande place aprs le  |.
(b) cat fich1 fich2 > fich3 Les commandes du pipe sont excutes en parallle par des processus distincts 3. Il fau
se le rappeler quand une des commandes du pipe contient un exit : la commande exit n
Redirection avec ajout
la n du chier de redirection (>>) fait sortir que du sous-shell qui excute la commande du pipe et pas du shell dans lequ
s'excute le pipe (voir 17.4.7).
Il faut utiliser  >> au lieu de  >. Le code retour du pipe est le code retour de la dernire commande excute dans
Exemple 14.2 pipe.
ls -l >> fich Exemples 14.5
(a) ls -l /bin | grep '^d'
14.2.2 Redirection du chier d'erreur (2>) (b) On peut composer plusieurs pipes :
Le chier d'erreur peut tre redirig en ajoutant  2>chier ( 2>>chier, si on ne veut ls -l /bin | grep '^d' | lpr
pas craser chier)  la suite d'une commande (attention, pas d'espace entre le 2 et  >).
Exemple 14.3
find /students -name core -print 2>erreurs 14.4 Regroupement des commandes
Le regroupement de commandes est souvent utilis pour appliquer une redirection o
14.2.3 Envoi d'un message d'erreur (>&2) un pipe  plusieurs commandes.
Les message d'erreur doivent tre envoys vers la voie numro 2. Voici un exemple
(voir 16.4.4) : 14.4.1 Regroupement entre parenth
ses
echo "ERREUR" >&2
Les commandes regroupes entre des parenthses sont excutes dans un sous-shell ave
un environnement dirent de celui prcdant et suivant les parenthses.
14.2.4 Redirection de l'entre standard (<)
Exemple 14.6
L'entre standard peut tre redirige par  < chier. $ pwd
Exemple 14.4 /users/students/toto
mail toto@unice.fr < fichier 3. Dans les derni res versions de zsh, la derni re commande s'ex
cute dans le shell dans lequel le pipe

t
lanc

96 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.6. ALIAS 9


$ (cd /bin # pwd) 14.5.1 Gestion des jobs par ksh ou zsh
/bin
$ pwd
En ksh ou zsh (mais pas sous sh) l'utilisateur dispose de plusieurs commandes pou
/users/students/toto
choisir le plan o- les processus lancs s'excutent :
) l'utilisateur peut faire acher la liste de ses processus avec leur numro de job pou
14.4.2 Regroupement entre accolades le shell en cours et leur pid (voir 2.2), en tapant
Les commandes regroupes entre des accolades ne sont pas excutes dans un sous-shell jobs -l]
comme avec les parenthses. (l'option -l ache l'identi cateur de processus)
Les accolades doivent tre spares des commandes par au moins un espace. ) l'utilisateur peut suspendre le processus en cours en tapant
Attention, } et { ne sont reconnus qu'en dbut de commande. Ils doivent donc tre
prcds par un * (sparateur de commandes) si on veut les placer sur la mme ligne que Ctrl] Z
ce qui prcde. L'oubli du * est frquent et il est dicile  reprer car le shell n'indique ) il peut ensuite relancer l'excution de ce processus en arrire-plan en tapant
pas clairement le problme dans ses messages d'erreur.
bg %n]
Exemple 14.7 n est le numro de job pour le shell (voir 14.5) * par dfaut c'est le processus qu
{ echo "Fichiers fich1 et fich2 :" # pr fich1 fich2 # } | lpr -h vient d'tre suspendu qui est pass en arrire-plan.
) les processus en arrire-plan ou suspendus peuvent tre passs en avant-plan en tapan
14.5 Processus en arrire-plan (&) fg %n]
Lorsqu'on lance une commande, le shell attend la n de l'excution de la commande (si aucun numro de job n n'est donn, la commande lance en avant-plan le dernie
avant d'excuter une autre commande. processus lanc en arrire-plan).
Si on ajoute le signe  & derrire le nom de la commande (prcd ou non d'un espace), Ceci permet de suspendre momentanment un processus pour eectuer un travail e
le shell n'attend plus la n de son excution. On dit qu'il lance la commande en arrire-plan. de revenir ensuite  ce processus exactement  l'endroit o- on l'avait laiss. On peut pa
Exemple 14.8 exemple crire un programme sous emacs, enregistrer ce programme, suspendre emacs pa
ls -l | grep '^d' > fich & Ctrl] Z, compiler et excuter le programme et revenir sous emacs par fg. Cette possibilit
Quand on lance une commande en arrire-plan dans un shell interactif (pas dans un perd de son utilit si l'on travaille en environnement X Window car on peut alors facilemen
shellscript), le shell renvoie  l'cran le numro de job entre crochets (le premier processus passer d'une application  l'autre sans devoir en suspendre une.
lanc en arrire-plan par le shell en cours a le numro 1), et le pid de processus (voir 2.2)
attribu  cette commande.
On ne peut interrompre une commande lance en arrire-plan qu'avec la commande kill
14.6 Alias
(tudie en 7.2). Un alias est un synonyme pour une cha ne de caractres dans une commande. Les alia
Remarque 14.3 sont particuliers  ksh et  zsh * il n'y a pas d'alias dans le shell sh.
Lorsque l'utilisateur sort du systme (en fait, du shell lanc au dmarrage), tous les Par exemple,  alias x='chmod u+x' d nit l'alias x : si le premier mot d'une com
processus lancs en arrire-plan sont tus. mande est x, le shell remplacera ce mot par chmod u+x.
Pour tre prcis, il existe une commande nohup (pas tudie ici) qui permet de On peut dfaire un alias par la commande unalias, par exemple, unalias x.
lancer des commandes en arrire-plan, qui continueront leur excution aprs la sortie La liste des alias peut s'acher en tapant  alias sans argument.  alias x ache l
de l'utilisateur. valeur de l'alias x.
Un alias peut tre utilis comme raccourci d'une commande avec ses options comm
Les commandes at et batch permettent de lancer en arrire-plan des commandes  des pour l'alias x ci-dessus. On peut aussi l'utiliser pour dsigner une commande qui n'es
moments choisis ou lorsque le systme n'est pas trop charg, mme si l'utilisateur n'est pas pas place dans un des rpertoires de la variable PATH. Par exemple (sous Unix OSF),
connect.  alias quota=/usr/sbin/quota
98 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.8. MCANISMES D'INTERPRTATION 9
14.7 Substitution de commande 14.8 Mcanismes d'interprtation
Le shell interprte `commande` en le rempla'ant par tout ce que la commande envoie Cette section dcrit comment les lignes de commandes sont interprtes par le she
sur la sortie standard. avant que la commande ne soit lance.
Voici les t&ches eectues par le shell dans l'ordre de leur excution :
Exemples 14.9
(a) date=`date` 1. interprtation des espaces (pour distinguer les dirents mots),
2. substitution de tilde (~) (seulement pour ksh ou zsh),
(b) nom_maj=`echo $nom | tr 'a-z' 'A-Z'`
3. substitution des alias (seulement pour ksh ou zsh),
(c) echo je suis sous `pwd`
4. interprtation des redirections, des pipes 4 et des regroupements de commandes,
Remarques 14.4 5. interprtation des aectations 5,
(a) le code retour d'une aectation  a=`commande` est le code retour renvoy par
 commande. On peut ainsi crire 6. substitution des paramtres de position et de variables ($),
7. substitution des commandes,
if ligne=`grep mot fichier` # then
# cas ou grep a trouve une ligne 8. gnration des noms de chiers (caractres * ?  ] * voir 4.5.1).
else

fi
# cas ou grep n'a pas trouve une ligne
14.9 Inhiber l'interprtation du shell
On peut inhiber l'interprtation du shell (on dit aussi dpersonnaliser) avec les carac
(b) la commande est excute dans un sous-shell. tres suivants :
n inhibe l'interprtation spciale du caractre suivant.
(c) Attention, si la commande renvoie plusieurs lignes vers la sortie standard, le compor- ' toute interprtation est inhibe pour les portions de lignes entoures de '
tement est dirent selon que l'on travaille sous sh et ksh ou zsh. Par exemple, " dans les portions de lignes entoures de " (guillemets), l'interprtation des e
a=`ls -l` paces, la gnration des noms, la substitution des alias et de ~ sont inhibe
rangera dans a une seule longue ligne sous sh et ksh, ce qui peut tre gnant, mais mais pas la substitution des paramtres ($). Une apostrophe n'est pas interprt
donnera bien plusieurs lignes sous zsh. entre deux guillemets (ce qui permet d'introduire le caractre ' dans une cha n
de caractres.
(d) l'interprtation  l'intrieur des ` est complexe et peut donner des rsultats surpre- Exemple 14.10
nants : Essayez cette suite de commandes :
echo \\$HOME
ache \/users/profs/toto , et pourtant a=bonjour
echo $a bc *
echo `echo \\$HOME` echo \$a bc
ache $HOME echo "\$a bc *"
A cause de ce type d'exemple, ksh et zsh ont ajout le nouveau type de substitution echo '$a *'
de commande $(commande) qui n'a pas de telles anomalies : 4. il n'y a pas de g
n
ration des noms de chiers dans l'interpr
tation des parties correspondant au
echo $(echo \\$HOME)
chiers dans les redirections
5. comme pour les redirections, les
tapes suivantes sont aussi trait
es  part pour les aectations  pa
ache \/users/profs/toto exemple, aucune g
n
ration des noms n'est eectu
e dans  a=*
100 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.11. LANCEMENT DE L'EXCUTION D'UN SHELLSCRIPT 10
14.10 Recherche d'une commande par le shell Le systme s'aper'oit que le chier qui contient le shellscript n'est pas crit dans d
code directement excutable par le processeur de la machine et il lance donc un interprteu
Lorsque l'utilisateur tape une commande au clavier, voici les direntes tapes qui pour lire et excuter les lignes contenues dans le chier.
conduisent  l'excution de la commande : Toutes les commandes du shellscript sont excutes comme si elles taient tapes a
clavier. Une dirence importante est que les commandes sont excutes dans un processu
1. Interprtation de la ligne de commande par le shell, ls (dont la zone de code contient le code de l'interprteur) qui lit les lignes du shellscript e
2. Recherche de la commande, lance leur excution. Si le shellscript modi e l'environnement de dpart, celui-ci est rtab
lorsque l'excution du shellscript est termine (voir 15.2.9).
3. Excution de la commande avec redirection pralable des entres-sorties par le shell Il est important de noter que, sauf cas particulier tudi ci-dessous (#!),
si ncessaire. ) si on travaille sous sh ou ksh, l'interprteur lanc implicitement pour lire et excute
le shellscript est le shell courant (sh ou ksh selon le cas),
Voici comment s'eectue la recherche de la commande :
) si on travaille sous zsh, l'interprteur lanc implicitement est sh et pas zsh ! Si
) Si la commande correspond  une commande interne du shell, cette commande est chier contient des instructions comprises par zsh et pas par sh, il y aura une erreu
excute  l'intrieur du shell,  l'excution.
) sinon, si la commande correspond  une fonction (voir 16.3), cette fonction est ex- Pour que le shellscript soit interprt par zsh, il doit commencer par la ligne :
cute  l'intrieur du shell, #! /usr/local/bin/zsh -f

) sinon il ne peut s'agir que d'une commande correspondant  un chier de l'arbores- Excution d'un chier dont la premire ligne commence par '#!(
cence. Si le nom de la commande ne comporte pas de /, la variable PATH est
examine pour rechercher le rpertoire o- se trouve la commande. Si le chier comporte une premire ligne qui commence par  #!, Unix lance comm
interprteur non pas le shell habituel, mais le programme dont le nom absolu suit  #!
) Si le chier est un shellscript un nouveau shell est cr * il lit les lignes du (avec ventuellement un argument comme  -f dans l'exemple ci-dessus), auquel il ap
shellscript et les excute, plique comme arguments la ligne de commande tape par l'utilisateur. Voici des exemple
) si le chier contient du code binaire excutable, un nouveau processus est cr, concrets :
qui excute ce code. Si l'utilisateur tape la commande  c1 f1 f2,
) si c1 commence par  #! /bin/sh,
la commande excute sera  /bin/sh c1 f1 f2.
14.11 Lancement de l'excution d'un shellscript Le shellscript c1 est lu par le shell sh et excut avec les arguments f1 f2.
Un shellscript est un chier qui contient des noms de commandes et des instructions ) si c1 commence par  #! /usr/local/bin/zsh -f,
internes au shell. On peut utiliser un shellscript comme toutes les autres commandes. En la commande excute sera  /usr/local/bin/zsh -f c1 f1 f2.
particulier un autre shellscript peut l'utiliser. On peut ainsi se construire facilement de Le shellscript c1 est lu par le shell zsh et excut avec les arguments f1 f2. L'optio
nouvelles commandes adaptes  sa propre fa'on de travailler.  -f indique que le chier d'initialisation  .zshenv ne doit pas tre lu * voir 14.11.3
Les instructions internes du shell forment un langage de haut niveau possdant des ) si c1 commence par  #! /bin/awk -f,
instructions de tests et de boucles, des variables et des fonctions. la commande excute sera  /bin/awk -f c1 f1 f2.
On peut lancer l'excution d'un shellscript de trois manires direntes. Le programme c1 (ncessairement crit avec du code awk) est interprt par aw
sur les chiers f1 et  f2 (voir 13.10).
14.11.1 Lancement par le nom du shellscript Remarque 14.5
Si on a l'autorisation de lecture et d'excution sur le shellscript, on peut le lancer en Ce mcanisme ne peut fonctionner qu'avec les interprteurs (tels les shells ou awk
tapant simplement son nom. pour lesquels  # introduit des commentaires.
102 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.12. LANCEMENT EXPLICITE D'UN SHELL 10
14.11.2 Lancement par l'appel de la commande interne . Il faut noter que c'est le mode de lancement de zsh lorsqu'on lance une command
 rsh machine commande  sur une machine distante et un compte utilisateur qui a zs
Il reste une autre possibilit pour faire excuter un shellscript. Le nom du shellscript comme shell de dmarrage (voir cours sur les rseaux).
est prcd d'un point (laisser un espace entre le point et le nom du shellscript) :
. fichier
Dans ce cas, le shellscript chier est excut comme si ses commandes taient tapes 14.12 Lancement explicite d'un shell
directement au clavier. Un nouveau processus n'est pas cr. Les modi cations de l'envi-
ronnement seront donc conserves. zsh -f]
En fait, . est une commande interne du shell qui lit toutes les commandes contenues Les chiers .zshenv, .zshrc et /etc/zshrc sont excuts sauf si le shell est lanc ave
dans le chier et les excute comme si elles avaient t tapes au clavier. l'option  -f. Le chier /etc/zshenv est toujours excut.
Il faut noter que c'est le mode de lancement de zsh lorsque l'on ouvre une fentre ave
Remarque 14.6 xterm .
Quel que soit le shell, le shellscript est toujours lu et excut par le shell en cours, 
la dirence de l'appel par le nom du shellscript o- il y a une dirence entre zsh et
les autres shells (voir remarques de 14.11.1).
Exemple 14.11
Soit le shellscript cdbin contenant la seule commande
cd bin
Si on tape
cdbin
(le nom du shellscript), le rpertoire sera le mme aprs l'excution qu'avant. En
eet, le shellscript s'excute dans son propre environnement et il n'a pas d'action sur
l'environnement du shell de dpart.
Si on tape
. cdbin
le rpertoire courant sera bin aprs l'excution car cd est une commande interne du
shell et non pas une commande externe correspondant  un chier Unix. Elle est
donc excute directement par le shell sans faire appel  un autre shell qui aurait son
propre environnement. Puisque l'on a excut cdbin avec un . initial, les commandes
de cdbin sont donc excutes par le shell initial dont le rpertoire courant devient
donc le rpertoire bin.

14.11.3 Lancement par l'appel explicite d'un shell


Si on a l'autorisation de lecture sur le shellscript, on peut lancer son excution par :
zsh -f] fichier
(si on travaille avec zsh ) dans ce cas, un nouveau shell est lanc explicitement. Celui-ci lit
les commandes du shellscript chier et les fait excuter comme si les commandes avait t
tapes au clavier.
Le chier .zshenv est excut sauf si le shell est lanc avec l'option  -f. Le chier
/etc/zshenv est toujours excut.
104 CHAPITRE 15. VARIABLES, ENVIRONNEMENT 15.2. VARIABLES 10
Cette possibilit est souvent utilise dans les shellscripts pour rcuprer un ou plusieur
mots d'une ligne. Par exemple, les deux commandes suivantes achent le mois et l'ann
de la date systme :
set `date`

Chapitre 15
echo $2 $6

Remarque 15.1
set -x abc

Variables, environnement
ne convient pas pour donner  $1 la valeur -x et  $2 la valeur abc. En eet, set v
penser que -x est l'option du shell tudie en 17.11. L'option  -- indique que le
paramtres suivants ne sont pas des options du shell mais les valeurs des paramtre
de position. Il faut donc crire :
set -- -x abc

15.1 Paramtres, variables de position


15.1.1 Param
tres des shellscripts 15.2 Variables
Lorsqu'on lance une commande, on peut la faire suivre par des arguments ou para- 15.2.1 Identi cateur
mtres. Durant une session de travail d'un shell (dlimite par le dmarrage et l'arrt du shell
4 l'intrieur d'un shellscript, ces paramtres sont dsigns par les variables de position on peut utiliser des variables dsignes par un identi cateur. Cet identi cateur peut com
$1, $2,..., $9 ($0 dsigne le nom de la commande). porter des lettres, des chires ou le caractre soulign * il doit commencer par une lettre o
Exemples 15.1
le caractre soulign.
(a) Si le shellscript lt contient
ls -lt $1 | more
15.2.2 Aectation
on peut lancer On peut aecter une cha ne de caractres aux variables :
lt /users/students/jean variable=valeur
(pas d'espaces de part et d'autre du signe = !).
(b) Si le shellscript cherche contient  variable= aecte la cha ne vide  variable.
find $1 -name "$2" -print Remarque 15.2
on peut taper Le code retour d'une aectation du type
cherche /usr "compt*" a=`commande`
qui cherchera sous l'arborescence du rpertoire /usr les chiers dont le nom commence est le code retour renvoye par la commande.
par compt.
On peut par exemple crire
15.1.2 Donner des valeurs aux param
tres de position (set) if lignes=`grep mot fichier` # then ...
et ce qui suit le then ne sera excut que si le chier contient le mot.
La commande set permet d'aecter des valeurs aux paramtres de position  l'intrieur
d'un shellscript. La commande suivante donne les valeurs val1, val2, ... aux paramtres $1, 15.2.3 Dsignation de la valeur de la variable ($)
$2, ... :
set val1 val2 ... On peut rutiliser la valeur aecte  une variable dans toute commande.
106 CHAPITRE 15. VARIABLES, ENVIRONNEMENT 15.2. VARIABLES 10
$variable PATH rpertoire de recherche des commandes
dsigne la valeur de variable. C'est le shell qui fera le remplacement. Exemple : PATH=/bin:/usr/bin:/users/students/util:.
Le rpertoire courant peut tre indiqu par : au dbut ou  la n de la va
Remarque 15.3 leur de PATH. Il est recommand de ne pas mettre trop de rpertoires dan
Le shell ne fera pas le remplacement dans les portions de commande places entre cette variable pour ne pas surcharger le systme en cas de recherche d'un
apostrophes ou si le $ est prcd d'un  \. Au contraire de la gnration de noms commande qui n'existe pas (et qui sera recherche dans tous ces rpertoires
de chiers, le remplacement est eectu dans les portions de commande places entre CDPATH est une variable quelquefois utile si on travaille souvent dans des rpertoire
guillemets (voir 14.8). dont le chemin est long  taper. Si l'utilisateur tape un nom qui ne commenc
Exemple 15.2 pas par un / en argument de cd, cd recherchera ce nom dans les rpertoire
r1=/us2/acct/jean/dvp indiqus dans CDPATH. Le format de CDPATH est le mme que celui d
r2=/us2/bin PATH.
cd $r1 Attention, sous sh et ksh, si la variable CDPATH a une valeur, cette va
cp fich $r2 riable est utilise exclusivement pour rechercher les rpertoires dont le nom
ne commence par / dans une commande  cd  (comme pour la variab
Si la valeur de la variable doit tre suivie d'un caractre autoris dans un nom de PATH et la recherche de commandes). Si on est par exemple plac dans so
variable, on entoure d'accolades le nom de la variable : rpertoire HOME et que celui-ci contient un rpertoire bin, la command
Exemple 15.3  cd bin dplacera dans le premier rpertoire bin plac sous un des r
serie=math
pertoires de la variable CDPATH, et renverra une erreur s'il n'y en a pa
cp classe/${serie}1 rep
Veillez donc  toujours avoir le rpertoire courant au dbut de la valeur d
CDPATH si vous ne voulez pas avoir ce comportement. Sous zsh, le rpe
toire courant est toujours cherch en premier mme s'il n'est pas dans l
15.2.4 Dcomposition en mots des valeurs des variables de zsh variable CDPATH.
Attention ! zsh ne dcoupe pas la valeur d'une variable en mots. Le programme suivant PS1 premier prompt Unix. zsh ore de nombreuses possibilits particulires pou
va copier les deux chiers  f1 et  f2 sous le rpertoire  rep s'il est excut sous sh ou personnaliser le prompt (voir 15.3).
ksh, mais il ne fonctionnera pas sous zsh car cp essaiera de copier le chier de nom  f1 f2 PS2 deuxime prompt Unix (> par dfaut)
(un seul nom avec un espace au milieu) : TERM nom du type de terminal utilis
fichiers="f1 f2"
IFS sparateur(s) de mots dans les commandes (espace, tabulation ou passag
cp $fichiers repertoire
 la ligne par dfaut). IFS est utilise lors d'une substitution de command
Il faut crire 
${=fichiers}  si on veut que la valeur de la variable  chier soit d- (`...` ou $()), de paramtre ou de variable ($), ou lors de la lecture d'un
coupe en mots. Sous zsh la commande de l'exemple prcdent doit donc s'crire : ligne par la commande interne read, pour dcouper une ligne en mots. O
cp ${=fichiers} repertoire
remarquera que IFS n'est pas utilise entre guillemets car les guillemet
inhibent la sparation en mots. Essayez la suite de commandes suivante :
15.2.5 Supprimer une variable (unset)
$ IFS=/
$ read x y
unset variable v1/v2
$ echo $x
Remarque 15.4 $ var=a/b/c
La commande unset n'existe pas dans le shell sh. $ echo $var # $=var avec zsh
$ echo "$var" # different si entre guillemets

15.2.6 Variables spciales du shell $ cat /etc/passwd


IFS=  remet la valeur par dfaut.
Voici les principales variables utilises par le shell.
HOME rpertoire de login
108 CHAPITRE 15. VARIABLES, ENVIRONNEMENT 15.2. VARIABLES 10
Les variables suivantes ont leur valeur donne automatiquement par le shell * on ne peut Le code retour est 0 sauf si on a atteint une n de chier.
modi er leur valeur. Exemples 15.5
# nombre de paramtres de position (a) echo Nom du repertoire a lister :
? valeur retourne par la dernire commande excute read rep
! numro de processus de la dernire commande lance en arrire plan ls -ld $rep | more
$ numro de processus du processus en cours
* $* est quivalent  $1 $2 ... pour lire au clavier le nom d'un rpertoire  lister.
@ $@ est quivalent  $1 $2 ... comme $* * mais il existe une dirence subtile (b) read v1 v2 v3 <fichier
entre les 2 variables * et @: "$*" (entour de guillements) reprsente un lit dans la premire ligne du chier les valeurs des variables v1, v2 et v3. On verra
seul mot compos des arguments $1 $2 ... spars par un espace alors que la page 131 comment lire toutes les lignes d'un chier.
"$@" reprsente dirents mots gaux aux contenus de $1, $2, ..., avec un
espace sparateur qui sera interprt par le shell comme un sparateur de
mots ( voir exemple de l'instruction for en 17.4.3). 15.2.9 Porte d'une variable (export), environnement de travail
L'environnement de travail d'un shell est constitu des variables auxquelles le shell
15.2.7 Acher la valeur d'une variable (echo) donn une valeur et des variables que le shell a hrites du processus qui l'a lanc.
Une variable n'est ordinairement utilise que dans le shell o- elle re'oit son aectation
echo -n] $variable Si on veut la rutiliser dans les programmes appels ultrieurement par le shell, on do
Plus gnralement, echo envoie sur la sortie standard les valeurs de tous ses paramtres, exporter la valeur par export.
spars par un espace. Dans la commande ci-dessus, c'est le shell qui va remplacer $variable Remarque 15.5
par la valeur de la variable et echo achera cette valeur. On dira que les programmes appels ultrieurement par un shellscript sont des de
En Unix BSD, l'option -n permet d'viter le passage  la ligne aprs l'achage. En cendants du shellscript qui les a appels, ou que le shellscript est un anctre de ce
Unix Systme V, on peut passer en paramtres de echo des caractres spciaux et c'est le programmes.
caractre  \c qui indique que l'on ne doit pas passer  la ligne (ne pas oublier de protger
 \ de l'interprtation du shell). Par exemple : export variables...
echo "Donnez le nom du fichier \c: " recopie la valeur des variables dans l'environnement qui sera pass aux programmes appel
ultrieurement.
Exemples 15.4
(a) echo valeur de HOME : $HOME
Remarques 15.6
(a) Puisque c'est une recopie, les ventuelles modi cations des variables exportes n
(b) echo "Voici 5 espaces entre parentheses : ( )" modi eront pas l'environnement du shellscript appelant.
Question : que se passe-t-il si on enlve les guillemets? (b) ksh et zsh permettent d'aecter des valeurs  des variables tout en exportant le
La commande interne print de ksh et de zsh, permet des formats d'achage plus so- variables :
phistiqus, mais cette commande n'existe pas dans le shell sh. export a=3 fichier=fich12
On obtiendra une erreur si le shellscript est excut par sh et il faut donc l'viter.
15.2.8 Entre de la valeur d'une variable au clavier (read) (c) export qui ne se comporte pas de la mme fa'on dans les tous les shells :
read variable... ) avec sh, si un programme modi e une variable qui a t exporte par un pro
Une ligne est lue sur l'entre standard. Le premier mot est aect  la premire variable, gramme anctre et s'il n'exporte pas cette variable (avant ou aprs sa modi
le deuxime mot est aect  la deuxime variable,... La dernire variable re'oit le restant cation), les programmes descendants qu'il appellera, recevront la valeur initia
de la ligne. pour cette variable (et non la valeur modi e).
S'il y a moins de mots que de variables, les dernires variables sont initialises  la Si un programme modi e la valeur d'une variable et veut transmettre la nouvel
cha ne vide. valeur aux programmes qu'il appelle, il doit donc exporter cette variable.
110 CHAPITRE 15. VARIABLES, ENVIRONNEMENT 15.3. PERSONNALISATION DE L'ENVIRONNEMENT 11
) avec ksh et zsh, si une variable a t exporte par un programme, elle le sera est le seul chier qui est toujours excut. Si ncessaire, il donne un environnemen
automatiquement par tous les programmes appels par le programme. minimum pour travailler.
Si zsh a t lanc avec l'option  -f, c'est le seul chier de conguration a tr
15.2.10 Visualisation des variables disponibles (set, printenv) excut.
printenv 2. .zshenv
ache les valeurs des variables de l'environnement du processus en cours (celles qu'il a est toujours excut si zsh n'a t pas lanc avec l'option  -f. Il initialise les va
recues et celles qu'il a exportes) * export (sans nom de variable) donne un rsultat riables d'environnement indispensables au bon fonctionnement du shell dans tous le
semblable sous zsh et ksh, mais sous sh, export donne uniquement le nom des variables cas (PATH par exemple).
exportes par le shell en cours.
set
ache les valeurs des variables disponibles (mme celles qui ne sont pas exportes et qui 3. /etc/zprofile et .zprofile
n'appartiennent pas  l'environnement qui sera transmis).
(excuts par les shells de login seulement) initialisent les variables d'environnemen
indispensables au bon fonctionnement du shell juste aprs un login. Ce chier n'es
15.3 Personnalisation de l'environnement en gnral pas utilis car un shell de login est le plus souvent un shell interactif et o
utilise alors plutt le chier .zlogin (voir ci-dessous).
15.3.1 Options des shells (set, setopt) 4. /etc/zshrc et .zshrc
De nombreuses options permettent de con gurer le fonctionnement des shells (voir en (excut par les shells interactifs seulement) contiennent les d nitions d'alias, d
particulier 14.1.2). Ces options peuvent tre entres en paramtres lors du lancement du prompts et des variables lies  l'utilisation interactive d'un shell.
shell ou positionnes gr&ce  la commande set. On se reportera au manuel de rfrence du
shell pour la syntaxe utilise pour positionner les options. Remarque 15.7
On a vu aussi en 3.3 l'option  -o ignoreeof et on verra l'utilit des options  -v et Quand on ouvre une nouvelle fentre X Window, ces chiers sont excuts (apr
 -x pour la mise au point des shellscripts en 17.11. les chiers /etc/zshenv et .zshenv) par le nouveau shell qui s'excute dans l
La fonction interne setopt de zsh permet aussi de positionner les options du shell. On fentre.
peut avoir une liste de toutes les options positonne en tapant  setopt seul.
Exemple 15.6
Dans les sections suivantes nous allons tudier les dirents chiers de conguration umask 022
de l'environnement que le shell zsh excutent automatiquement au dmarrage. # definition des alias
alias ll='ls -l'

15.3.2 Fichiers de personnalisation alias x='chmod u+x'


# definition prompt : ordinateur et repertoire courant
4 chaque fois qu'un shell zsh est lanc, des chiers de con guration sont lus et excuts PS1=%m'(%~) '
automatiquement par le shell. # definition de variables
Certains chiers sont communs  tous les utilisateurs et permettent  l'administra- export PRINTER=17
teur du systme de leur donner un environnement minimum commun. Ce sont les chiers export MAIL=/usr/spool/mail/$USER
zshenv, zshrc, zprofile et zlogin du rpertoire /etc. export MANPATH=/usr/man:/usr/local/man:/usr/local/X11R5
Les autres chiers sont situs dans le rpertoire HOME de chaque utilisateur. Celui- export SAVEHIST=300 HISTFILE=$HOME/.sh_history HISTSIZE=300
ci peut les crer ou les modi er  sa convenance. Ce sont les chiers .zshenv, .zshrc, # Pour compatibilite avec ksh :
.zprofile et .zlogin setopt NO_NOMATCH
Ces chiers ne sont pas toujours tous excuts. Voyons les dirents cas. export NULLCMD=:

1. /etc/zshenv 5. /etc/zlogin et .zlogin


112 CHAPITRE 15. VARIABLES, ENVIRONNEMENT 11
(excuts par les shells de login interactifs seulement) contiennent les initialisations
qui doivent tre faites au dbut d'une session de travail interactive, en particulier
l'aectation des variables TERM et DISPLAY.
Exemple 15.7
if tty -s # then

fi
stty dec crt Chapitre 16
Complments sur le shell
if  -z "$DISPLAY" ] # then # cas ou DISPLAY est vide
echo '-----------------------------------------------'
echo ' 1. vt100
2. X Window'
echo -n "Type de votre terminal (2 par defaut): "
read terminal Ce chapitre donne quelques complments sur des notions dj tudies dans les deu
case $terminal:-2 in chapitre prcdents. Il prsente aussi quelques nouveaux aspects moins essentiels du langag
1) TERM=vt100## du shell.
2) TERM=xterm
echo "Nom du DISPLAY ? "

esac
read DISPLAY## 16.1 Listes de commandes
fi Un pipe est une suite de commandes spares par j. Le code retour d'un pipe est
Remarque 15.8 code retour de la dernire commande excute.
Les chiers utiliss lors de l'criture de chiers de con guration (au moins ceux qui Une liste de commandes est une suite de pipes 9ou de simples commandes * dans l
ne sont pas lis  un shell de login) doivent tre dsigns par leur nom absolu car les suite, par commodit, pipe pourra dsigner une simple commande) spares par un de
shells peuvent tre lancs d'un autre rpertoire que le rpertoire de login. signes suivant :
 correspond  une excution squentielle des pipes
& correspond  une excution squentielle des pipes sans attente de la n de l'ex
15.4 Stratgie pour la personnalisation de l'environne- cution du pipe prcdent
&& le pipe suivant n'est excut que si le pipe prcdent renvoie la valeur 0 (drou
ment lement normal du pipe prcdent)
On travaille le plus souvent dans plusieurs domaines bien distincts, par exemple, un jj le pipe suivant n'est excut que si le pipe prcdent ne renvoie pas la valeur
environnement pour le dveloppement en langage Java, un environnement pour le travail (droulement anormal du pipe prcdent)
avec une base de donnes et un autre pour la recherche d'information sur le Web. Exemples 16.1
Dans ce cas, il est prfrable d'avoir des environnements de travail dirents plutt (a) rm fich || echo Suppression impossible !!
que d'avoir un seul environnement alourdi par un grand nombre de variables et avec une
variable PATH contenant de nombreux rpertoires. (b) cat $2 | { write $1 || mail $1 #}
Pour cela le plus simple est d'allger les chiers d'initialisation vus ci-dessus en ne gar- shellscript qui envoie un message sur l'cran ou dans la bo te aux lettres d'un util
dant que les lments qui seront utiles  tous les environnements, et de crer un shellscript sateur connect  la machine locale.
d'initialisation pour chacun des environnements. Chacun de ces shellscripts initialisera les
variables (en particulier la variable PATH), placera l'utilisateur dans le bon rpertoire de Quelques subtilits (false est une commande qui ne fait que renvoyer un code retou
travail et lancera les programmes ncessaires (par exemple, il ouvrira une nouvelle fentre non nul * true est une commande qui ne fait que renvoyer un code retour nul) :
X Window dans laquelle il lancera un programme pour travailler avec une base de donnes). false && echo 1 && echo 2
n'ache rien
114 CHAPITRE 16. COMPLMENTS SUR LE SHELL 16.4. COMPLMENTS SUR LES REDIRECTIONS 11
true && echo 1 && echo 2 Excution de la fonction
ache 1 et 2 Les commandes de la fonction s'excutent dans le shell dans lequel la fonction a t
false || echo 1 && echo 2
ache 1 et 2 appele. Les $1, $2,... sont remplacs par les paramtres d'appel de la fonction (param
param2,...).
true || echo 1 && echo 2
ache 2 Exemple 16.2
Si la fonction lt est d nie par :
16.2 Ordre de priorit lt () { ls -lt $1 | more }

L'ordre de priorit des dirents signes qui ont une signi cation particulire pour le on pourra lancer la fonction par :
shell est (par ordre dcroissant) : lt /bin

1. les redirections Place  l'intrieur d'une fonction la commande


return n
2. j joue le rle de la commande exit pour un shellscript : elle arrte l'excution de la fonctio
en renvoyant le code retour n.
3. && et jj
4. & et * 16.4 Complments sur les redirections
16.4.1 Redirection de l'entre standard sur chier inclus (<<)
16.3 Fonctions  << permet d'indiquer dans un programme des lignes qui seront lues sur l'entre stan
dard pendant l'excution du programme. Le dlimiteur de ces lignes est indiqu juste apr
Les shellsripts peuvent contenir des d nitions de fonctions qui pourront ensuite tre le signe  <<. Le dlimiteur de n doit absolument tre le premier caractre dans sa lign
utilises dans le shell dans lequel elles ont t d nies. (avec ventuellement des tabulations si on fait suivre  << de  - * voir ci-dessous) sino
Les fonctions sont plus rapidement excutes que les shellscripts puisque le shell n'a pas on obtient des messages du type  n de chier inattendue car le dlimiteur n'a pas t
 aller chercher de chier pour l'excuter. De plus une fonction peut modi er les variables reconnu.
du shell appelant puisqu'elle s'excute dans le mme environnement que ce shell. L'ensemble des lignes ainsi dlimites est appel un chier inclus. En eet, tout se pass
comme si elles appartenaient  un chier vers lequel on redirigeait l'entre standard.
Si le premier caractre du dlimiteur est prcd de  \, cela signi e que le shell ne do
D nition d'une fonction pas interprter les caractres spciaux (*, ?, `, ...) situs entre les deux dlimiteurs. Tou
nom-fonction () se passe comme si le texte entre les deux dlimiteurs tait entour du caractre '.
{ Si  - est ajout  la suite de  <<, toutes les tabulations de dbut de ligne sont enleve
... du chier inclus. Ceci permet d'indenter ces lignes si elles appartiennent, par exemple,
... une boucle for ou  une structure if.
} Utilis avec l'diteur de texte ed , la notion de chier inclus permet de modi er un chie
L'accolade de n de fonction doit tre en dbut de ligne (ou prcde de *). avec des commandes construites dans un shellscript. Nous n'tudierons pas ici l'diteur d
texte ed. Les commandes de ed utilises dans l'exemple ci-dessous sont :
Appel de la fonction s substitue une cha ne de caractres  une autre. Dans chaque ligne, seule la premir
occurrence de la cha ne cherche sera remplace sauf si on ajoute l'option g  la
nom-fonction param1 param2 ... de la commande (voir exemple ci-dessous). Comme la commande suivante, s peu
116 CHAPITRE 16. COMPLMENTS SUR LE SHELL 16.4. COMPLMENTS SUR LES REDIRECTIONS 11
tre prcd d'un intervalle de lignes qui indique les lignes sur lesquelles portera la Si le signe de redirection  < ou  > est prcd d'un nombre entier, cela signi e qu
commande ($ dsigne la dernire ligne). la redirection concerne le chier dont le descripteur est le nombre entier donn, et no
En fait, les cha nes de caractres peuvent tre des expressions rgulires et on peut l'entre, la sortie ou l'erreur standard. Il ne doit pas y avoir d'espace entre le numro et
se rfrer dans la deuxime cha ne  une sous-cha ne de la premire. Par exemple, signe qui le suit.
s/^\(^:]*\),\(.*\)$/\2 est le prenom de \1/ Exemples 16.4
transformera Dupond,Pierre en Pierre est le prenom de Dupond. (a) 3< fichier et 3> fichier
ces deux commandes ouvrent chier avec le descripteur 3 (et non pas le descripteu
Consultez le manuel en ligne de ed pour plus de prcisions. 0 ou 1 s'il n'y avait pas eu le 3). La dirence est que la deuxime redirection cras
fichier.
g excute une commande sur toutes les lignes qui contiennent une expression rgulire
(par exemple,  1,5g/^toto/d supprime les lignes qui commencent par toto dans (b) Pour fermer le chier ouvert avec le descripteur 3, on utilise les commandes <&- e
les 5 premires lignes. >&- (pas d'espace aprs le signe de redirection) qui ferment les chiers d'entre et d

w sauvegarde le chier en cours d'dition. sortie standard * la commande suivante ferme le chier de descripteur 3 :
3<&-
q quitte ed.
La syntaxe d'appel de ed est : 16.4.4 Redirection vers un chier dsign par son descripteur
ed -s] fichier
o- l'option -s indique que l'on ne veut pas que ed ache certaines informations comme, >&n (resp. <&n)
par exemple, le nombre d'octet enregistrs lors de la commande w. signi e que la sortie (resp. entre) standard est redirige vers le chier ouvert avec
descripteur n et que les deux chiers partagent le mme pointeur de chier (voir fonctio
Exemple 16.3 dup() en langage C). Il ne faut pas d'espace entre > et &.
ed -s $3 <<FIN  > fichier crase fichier et positonne le pointeur de poistions courante du chie
1,\$s/$1/$2/g au dbut du chier alors que  >&n (ou  <&n) dsigne un chier sans modi er la valeur d
w position courante.
q
FIN Exemples 16.5
(a) Pour acher un message d'erreur :
Le shellscript remplace ci-dessus remplace une cha ne par une autre dans un chier
(par exemple :  remplace ch1 ch2 fichier) echo "$0: Erreur ...." >&2

(b) Si on veut faire imprimer les erreurs de syntaxe d'un programme en langage C :
16.4.2 Redirection pour tout un shell (exec) cc pgm.c 2>&1 | lpr
La commande interne exec, outre le lancement d'une comande en remplacement du car les erreurs sont rediriges vers la sortie standard qui est envoye par le pipe  l
shell, permet des redirections qui seront valables jusqu' la sortie du shell. La commande commande lpr.
suivante, place dans un shellscript, enregistrera tous les messages d'erreurs du shellscript
dans le chier  suivi.err, jusqu' la n du shellscript : 16.4.5 Ordre d'valuation des redirections
exec 2>suivi.err
Les redirections sont values de gauche  droite. Par exemple, les deux redirection
16.4.3 Descripteurs de chier suprieurs  2 suivantes
1>fich1 2>&1
On sait que les trois chiers standards sont ouverts avec les descripteurs 0, 1 et 2. Un vont rediriger la sortie standard et le chier standard des erreurs vers ch1. Dans l'ordr
shellscript peut ouvrir d'autres chiers en utilisant les descripteurs suprieurs  2. inverse, seule la sortie standard aurait t redirige vers ch1.
118 CHAPITRE 16. COMPLMENTS SUR LE SHELL 16.5. COMPLMENTS SUR LES VARIABLES 11
16.4.6 Redirection sans commande avec zsh ${var:=val}
donnera la valeur val  la variable var si celle-ci est gale  la cha ne vide.
Avec les shells sh ou ksh, une redirection sans commande ne va rien faire ( < fichier)
ou va crer un chier vide ( > fichier). Avec zsh, une commande par dfaut est ajoute
avant la redirection. Le nom de cette commande est contenue dans la variable NULLCMD * 16.5.2 Modi er l'environnement d'une commande
c'est la commande cat par dfaut. Si on veut que zsh se comporte comme sh et ksh, on On peut modi er l'environnement d'une commande en la pr xant d'une ou de plusieur
ajoute les lignes suivantes dans le chier .zshrc : aectations de variables (spares par des espaces).
NULLCMD=:
export NULLCMD
Exemple 16.7
rep=/usr/bin commande arguments...
16.5 Complments sur les variables Attention, la porte de cette aectation se limite  la commande pr xe * l'aectatio
ne modi era pas l'environnement du shell dans lequel la commande aura t tape.
16.5.1 Valeurs par dfaut pour les variables
Exemple 16.8
Il est possible de substituer des valeurs aux valeurs des variables ou des paramtres de a=5
position comme suit (les valeurs relles des variables ou paramtres ne sont pas modi es a=6 echo $a
par ces substitutions sauf pour =).
On dit qu'une variable est active si elle a re'u une valeur. Un paramtre de position achera 5 et pas 6 car la commande echo est une commande interne au shell.
est activ si la commande a t lance avec au moins autant d'arguments que le numro Erreur  ne pas faire : si l'on veut concatner deux valeurs dans une variable (pa
du paramtre. exemple abc et def), en les sparant par un espace, ne pas crire
${variable-mot} a=abc def
si la variable n'est pas active, elle est remplace par la valeur mot. qui serait interprt comme le lancement de la commande def en lui exportant la valeu
${variable?mot} abc de la variable a. Ecrire plutt :
si la variable n'est pas active, mot est ach et l'excution est arrte. Si mot est omis, a="abc def"
un message standard est ach.
${variable+mot}
si la variable est active, elle est remplace par mot, sinon la cha ne vide est substitue. 16.5.3 Facilits de ksh et zsh pour le traitement des valeurs d
${variable=mot} variables
si la variable n'est pas active, sa valeur devient mot. Ne marche pas pour les paramtres
de position. ksh et zsh orent un plus par rapport  sh ( ne pas utiliser si on veut crire u
shellscript portable sur sh * utiliser plutt la commande expr ) :
Remarque 16.1 ${#variable}
mot est interprt par le shell, sauf quand il suit un ?. Il peut ainsi tre une donne la taille du contenu de la variable.
substitution de commande ou dsigner la valeur d'une variable. ${variable#modle}
(o- modle est une cha ne de caractres pouvant contenir les caractres spciaux utilis
Exemples 16.6 par la gnration des noms de chiers par le shell) si modle correspond au dbut de l
(a) cd ${rep=$HOME} valeur de variable, la valeur renvoye est la valeur de variable sans la plus petite portio
de texte du dbut qui correspond  modle. Sinon, la valeur renvoye est celle de variabl
(b) var=${2?il manque des parametres}
${variable##modle}
(c) cd ${DIR-$HOME} la mme chose que ci-dessus mais on supprime la plus grande portion de texte du dbu
qui correspond  modle.
Si les signes -,?, +, = sont prcds du signe  :, le comportement pour une variable ${variable%modle}
gale  la cha ne vide est le mme que pour une variable non active. Par exemple, ou
120 CHAPITRE 16. COMPLMENTS SUR LE SHELL 12
${variable%%modle}
la mme chose que # et ## mais on supprime la portion de texte de la n de la valeur de
variable qui correspond au modle.
Exemples 16.9
(a) Si var contient la valeur /usr/local/bin,
${var##*/}
est gal  bin et
${var#*/}
est gal usr/local/bin (sans le / du dbut)
(b) Si on travaille avec ksh, on peut placer
PS1='${PWD#$HOME/}$ '
dans le chier
.profile pour avoir un prompt qui indique le rpertoire courant sans
tre trop long pour les noms de rpertoire qui sont sous le rpertoire courant. Quatrime partie
16.5.4 Modi cation interactive de la valeur d'une variable sous
zsh (vared) Programmation
zsh ore une facilit pour modi er en interactif la valeur d'une variable avec la com-
mande vared ( variable editor ). Par exemple,
vared PATH
permet de modi er la valeur de la variable PATH  la manire de emacs.

16.5.5 Tableaux sous ksh et zsh


Les shells ksh et zsh permettent d'utiliser des tableaux.
La syntaxe n'est pas la mme pour ces deux shells. Nous ne donnerons que des exemples
avec la syntaxe de zsh :
samoa(~) tableau=(abc def)
samoa(~) echo $tableau
abc def
samoa(~) echo $tableau1]
abc
samoa(~) echo $tableau2]
def
12

Chapitre 17
Programmation des shellscripts
Ce chapitre tudie les commandes les plus souvent utilises dans l'criture des shell
cripts. Toutes ces commandes sont internes au shell, sauf la commandes expr.

17.1 Tests divers (test,  ... ],  ... ]])


Cette commande permet de tester une condition. Elle est souvent utilise par les struc
tures de contrle du shell. Cette commande est interne ou externe selon les shells et le
versions d'Unix et les options peuvent varier suivant les versions (consultez le manuel e
ligne).
test condition
ou
 condition ]
renvoie 0 si condition est vraie et une valeur dirente de 0 si condition est fausse.
Dans la deuxime forme,   est le nom d'une commande synonyme de la command
test. Le  ] est l pour faire joli. Il ne faut pas oublier les espaces de part et d'autre d
condition.
Quelques conditions (attention  bien sparer les dirents mots par des espaces) :
-d chier vrai si chier est un rpertoire
-f chier vrai si chier est un chier ordinaire
-r chier vrai si on a l'autorisation de lire chier
-w chier vrai si on a l'autorisation d'crire dans chier
-x chier vrai si on a l'autorisation d'excution dans chier
-s chier vrai si chier n'est pas vide
chane
-n chane vrai si la cha ne n'est pas vide
-z chane vrai si la cha ne est vide
n1 -eq n2 vrai si les 2 nombres entiers n1 et n2 sont gaux. A la place de eq on peu
6 , >, , <, ).
avoir ne, gt, ge, lt, le (pour =
124 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.2. DCALER LES PARAMTRES DE POSITION (SHIFT) 12
chane1 = chane2 17.2 Dcaler les paramtres de position (shift)
vrai si les 2 cha nes sont gales
chane1 != chane2 shift n]
vrai si les 2 cha nes ne sont pas gales dcale les paramtres de position de n positions. Par dfaut n est gal  1 : $2 devient $
-t numro] $3 devient $2, etc.
vrai si le numro est le numro d'une voie ouverte sur un terminal (par shift est souvent utilis par les structures de contrle de rptition pour utiliser  tou
dfaut, numro est gal  1, c'est--dire correspond  la sortie standard) de rle les dirents paramtres de position (voir exemples en 17.4.4).
-L chier vrai si chier est un lien symbolique. Cette option existe pour la commande
interne de ksh et de zsh mais pas pour toutes les commandes externes. Elle Exemple 17.3
peut aussi s'appeler -h pour certaines commandes externes. Si le shellscript decale contient
Remarque 17.1 shift
Si un lien symbolique pointe sur un rpertoire, l'option -d est vraie sur ce lien. Il faut echo $1
donc commencer par tester si c'est un lien symbolique si on veut faire la dirence.
l'excution de decale 1 2 achera 2.
On peut combiner ces conditions avec les oprateurs logiques
-a et logique
-o ou logique 17.3 Sortie d'un shellscript (exit)
! ngation logique
On peut regrouper avec des parenthses (entoures d'un espace de part et d'autre et exit n]
prcdes par n pour qu'elles ne soient pas interprtes par le shell). fait sortir du shell (donc en gnral du shellscript qui est excut par le shell * voir 14.11
en renvoyant le code n (voir 14.1.6).
Exemples 17.1
(a) test -d $1 && echo OUI || echo NON
Exemple 17.4
exit 1

(b) test \( -d fich -o -f fich2 \) -a $var = oui Si le shellscript ne se termine pas par un exit ou si exit n'est pas suivi d'un nombre n
il renvoie le code de la dernire commande qu'il a excute.
De plus ksh et zsh orent un mcanisme interne pour tester les expressions condition-
nelles : Remarque 17.2
 expression conditionnelle ]] Il faut se m er des constructions des shells qui crent implicitement un sous-she
(des espaces sont ncessaires entre  expression conditionnelle et les doubles crochets). (voir 14.3 ou 17.4.7). Si une commande exit s'excute dans un de ces sous-shells, el
Les expressions sont les mmes que pour test mais le et logique se traduit par  && et le ne fera sortir que du sous-shell et pas du shellscript.
ou logique par  ||.
On dispose aussi de quelques ajouts. Par exemple,  < et  > permettent de comparer
deux cha nes de caractres dans l'ordre lexicographique (ordre du dictionnaire),  chane = 17.4 Les structures de contrle
modle est vrai si chane correspond  modle qui peut contenir les caractres spciaux
utiliss dans la gnration des noms de chiers (voir 4.5). 17.4.1 if .. then .. else ..
Aucune gnration des noms de chiers n'est eectue par le shell dans  expression Les commandes Unix renvoient toute un code retour qui est un nombre entier (voir 14.1
conditionnelle. En gnral, si la commande s'est bien droule, elle renvoie 0 * s'il y a eu une erreu
ou un droulement anormal de la commande, le code renvoy est ngatif ou strictemen
Exemple 17.2 positif.
 $fichier = *.c ]] La commande if prend en compte ce code renvoy par les commandes.
126 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.4. LES STRUCTURES DE CONTRLE 12
if liste-commandes # then Variantes de if
liste-commandes if liste-commandes # then
else liste-commandes
liste-commandes fi
fi
teste la valeur renvoye par la liste de commande qui suit le if (code de la dernire com- if liste-commandes # then
mande de la liste excute). Si la valeur est nulle, la liste de commandes qui suit le then liste-commandes
est excute, sinon c'est la liste qui suit le else qui est excute. elif liste-commandes # then
liste-commandes
Remarque 17.3 elif ...
Les mots cls if, then, else,  doivent appara tre en dbut de ligne (prcds seulement ...
d'espaces ou de tabulations) pour tre reconnus par le shell. Si on veut les mettre ...
 la suite d'autres instructions sur la mme ligne il faut les faire prcder d'un  #. else
La prsentation choisie dans ce cours suit le format couramment utilis en langage liste-commandes
C (else align avec le if ). Le then est plac sur la mme ligne que le if et il est donc fi
prcd d'un  #.
Cette structure est un raccourci plus simple et plus lisible pour la structure suivante
Exemples 17.5
(a) if cp rep1/* rep2 # then if liste-commandes # then
: liste-commandes
else else
echo "Impossible de copier les fichiers" >&2 if liste-commandes # then
fi liste-commandes
(b) !crivons un shellscript oui qui pourra tre utilis par d'autres shellscripts. Il ren- else
verra 0 si l'utilisateur rpond oui et il renverra 1 sinon : if ...
...
read reponse ...
if test "$reponse" = oui # then ...
exit 0 else
else liste-commandes
exit 1 fi
fi fi
fi
On peut utiliser ce shellscript dans un autre shellscript comme suit :
echo -n "Confirmez-vous la suppression ? "
if oui # then
rm * Exemple 17.6
fi if test "$reponse" = oui # then
exit 0
Remarque 17.4 elif test "$reponse" = non # then
Puisqu'en l'absence de commande exit, un shellscript sort avec le code retour de exit 1
la dernire commande excute, le shellscript oui pourrait aussi s'crire : else
read reponse exit 2
test "$reponse" = oui fi
128 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.4. LES STRUCTURES DE CONTRLE 12
17.4.2 case ... esac Exemples 17.8
(a) for i in 1 2 3
case mot in
do
modle1) liste-commandes ##
echo $i
.
done
.
modlen) liste-commandes ## (b) Pour voir la dirence entre $* et $@, excutez le shellscript suivant avec quelque
esac paramtres, remplacez ensuite $* par $@ et excutez le  nouveau avec les mme
case est une instruction de choix multiple : le premier modle rencontr qui correspond paramtres. Notez la dirence. Dans la premire version on n'a qu'un seul tour
 la valeur de mot indique la liste de commandes  excuter. Si mot ne correspond  aucun car  $* est considr comme un mot unique.
des modles, l'excution se poursuit  l'instruction qui suit esac.
Les modles sont de la forme : for i in "$*"
val1 | val2... | valp do
Dans les modles, on peut utiliser les caractres spciaux  ? *  ] comme dans les echo $i
noms de chiers (voir 4.5). On peut ainsi tester si une valeur commence par un chire par done
le modle  0-9]*. (c) Le shellscript cherche suivant ache les chemins d'accs des chiers donns e
Exemple 17.7 argument :
Le shellscript oui donn en b peut s'crire : for fichier
do
read reponse
find / -name "$fichier" -print
case "$reponse" in
done
o|O|oui|OUI) exit 0 ##
n|N|non|NON) exit 1 ## Il sura de taper
*) exit 2 ##
cherche fich1 fich2 fich3
esac
pour faire acher les chemins d'accs des chiers spci s.
17.4.3 for ... do ... done Si on veut ajouter quelques tests et entrer la racine de la recherche en premier para
mtre, le shellscript cherche devient :
Il est frquent d'avoir un traitement qui se rpte pour chaque paramtre d'une com-
mande (par exemple, lpr ch1 ch2). La commande for permet de traiter successivement if test $# -lt 2 # then
tous les paramtres d'une commande. Elle permet aussi de rpter un traitement pour echo "$0 : Il faut au moins 2 arguments" >&2
plusieurs valeurs direntes. exit 2
for variable in mots...] fi
do if test ! -d $1 # then
liste-commandes echo "$0 : $1 n'est pas un repertoire" >&2
done exit 3
variable prend  tour de rle pour valeur chaque mot de la liste mots qui suit in. Pour fi
chaque valeur de variable, liste-commandes est excute. racine=$1
Si in mots... n'est pas prsent, variable prend pour valeur chacun des paramtres de shift
la commande (ce qui est quivalent  : for variable in $@ * voir 15.2.6). for fichier
do
Remarque 17.5 find $racine -name "$fichier" -print
Une boucle for sans in ne modi e pas les valeurs de $1, $2,... done
130 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.4. LES STRUCTURES DE CONTRLE 13
(d) Pour excuter un traitement (ici acher le nom) sur tous les chiers d'un rpertoire do
on utilise la substitution de commande : cherche "$1" "$2"
shift 2
for i in `ls -A` done
do
echo $i (d) Lecture ligne  ligne d'un chier structur en lignes :
done
while read ligne
17.4.4 while ... do ... done do
echo $ligne
while liste-commandes1
done < fichier
do
liste-commandes2
done 17.4.5 until ... do ... done
excute liste-commandes2 tant que liste-commandes1 renvoie un code 0. Est semblable  while mais la sortie de la boucle s'eectue si la liste de commandes qu
Exemples 17.9 suit until renvoie une valeur nulle.
(a) while test "$1"
do
echo $1
17.4.6 Instructions lies aux boucles (continue, break)
shift continue n]
done permet de sauter  la n de la boucle et de recommencer une nouvelle boucle.
break n]
ache tous les paramtres, un par ligne. Retenez le test sur $1 pour reprer le dernier
paramtre. provoque la sortie de la boucle en cours d'excution et passe  l'instruction qui suit l
boucle.
(b) Si le shellscript coucou contient : On peut ajouter un nombre entier n  la suite de ces 2 instructions pour indiquer qu
l'action porte sur des boucles externes. Par exemple, break 2 sortira de la boucle qu
while : englobe la boucle dans laquelle cette instruction est crite.
do
echo coucou
sleep 30
17.4.7 Probl
mes avec les boucles rediriges et les pipes
done Lorsqu'une boucle est redirige vers un chier, le shell l'excute dans un sous-shell.
en est de mme avec les commandes d'un pipe (sauf peut-tre la dernire commande).
Si on tape Ceci implique les deux problmes suivants :
coucou &
) une commande exit ne sortira pas du shellscript mais seulement de la boucle ou d
il s'achera coucou sur l'cran toutes les 30 secondes (ne pas rediriger sur le terminal pipe,
du collgue !). La commande interne  : est une commande qui ne fait rien et renvoie
le code retour 0 (voir 17.6). ) les aectations de variables  l'intrieur de la boucle ne seront pas connues en dehor
de la boucle ou du pipe.
(c) Pour rechercher dans l'arborescence une liste de chiers ($2) situs sous des rper-
toires dirents ($1), on peut utiliser le shellscript suivant (le shellscript cherche a Remarque 17.6
t crit en c) : Malgr tout on n'est pas oblig d'exporter une variable pour qu'elle soit connue de
sous-shells engendrs par le shell pour excuter la boucle redirige (vri ez-le tout d
while  "$1" ] # teste la fin de la liste mme pour la version du shell que vous utilisez).
132 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.5. INTERCEPTION DES SIGNAUX 13
Voici des mthodes (de type bidouillage) pour contourner ces deux problmes dans le Ces signaux sont pour la plupart des signaux d'interruption pour cause de droulemen
cas d'une boucle redirige : anormal (erreur au niveau du bus, mmoire insusante, etc.) ou d'interruption par l'util
) Pour le problme du exit, il n'y a pas de solution miracle. On doit s'adapter  chaque sateur (l'appui sur la touche d'annulation correspond au signal numro 2). La command
cas particulier. On peut envoyer un code retour spcial avec la commande exit  kill (tudie en 7.2) permet d'envoyer un signal  un processus repr par son numro.
l'intrieur de la boucle (par exemple 5) et on teste le code retour juste  la sortie de Exemples 17.10
la boucle. On peut ainsi sortir du shellscript si le code retour lu est le code spcial (a) trap '' 2 # les deux apostrophes designent la chaine vide
choisi. ignore l'interruption par la touche d'annulation
) Pour l'aectation de variable, il n'y a pas non plus de solution simple. On peut (b) trap 2
crire l'aectation dans un chier temporaire que l'on excute avec la commande  . rtablit la prise en compte de cette touche
(voir 14.11.2)  la sortie de la boucle. Par exemple (la valeur de $$ est la mme dans
les sous-processus du pipe mais il vaut mieux vri er), (c) temp=temp$$
trap 'rm -f $temp # exit 2' 1 2 15
echo "var=valeur" > ftemp$$
On peut aussi dans certains cas utiliser la substitution de commande comme il est supprime le chier temporaire dont le nom est compos de la cha ne temp suiv
dcrit ci-dessous pour le pipe. C'est alors la solution la plus propre'. du numro de processus,  la n du programme, si l'utilisateur appuie sur la touch
d'annulation ou si le programme a t interrompu par un kill ou par la dconnexio
) Pour le pipe, une solution est d'utiliser un chier temporaire qui contient les infor- de l'utilisateur.
mations que l'on veut faire passer au shell qui a appel le pipe. Dans certains cas, une
autre solution est de mettre le pipe dans un shellscript  part (ou une fonction), de Porte d'un trap : Le trap est en activit dans un shellscript  partir du moment o-
faire acher par ce shellscript les informations que l'on veut rcuprer, et d'utiliser est lu et jusqu' ce qu'un autre trap sur le mme signal soit lu. Les sous-shell n'hriten
une substitution de commande pour rcuprer ces valeurs. Cette dernire solution pas d'un traitement du signal initi par un trap. Cependant, si un shellscript ignore u
est aussi utilisable dans le cas d'une boucle redirige. signal, le signal ne sera pas transmis  ses ls.
Exemples 17.11
17.5 Interception des signaux (a) Lancez le programme suivant, tapez sur la touche d'annulation et voyez le messag
s'acher  l'cran.
trap liste-commandes] n...
Le plus souvent, un processus s'interrompt quand il re'oit un signal (voir 2.2.1). La com- trap "echo $0 : fin de programme # exit 2" 2
mande trap permet un comportement dirent  la rception du signal : liste-commandes coucou
sera excute si le programme re'oit un des signaux dont le numro est indiqu dans la liste
des n * ensuite, le programme continue  l'endroit o- il tait au moment de la rception du o- coucou est le shellscript suivant :
signal (sauf si une instruction comme exit a t excute entre temps).
Si n est 0, la liste de commandes sera excute  la sortie du shell en cours (en gnral, while :
 la n de l'excution du chier de commande qui contient l'instruction trap) ou  la sortie do
de la fonction (voir 16.3) dans laquelle a t d ni le trap. echo coucou
Si liste-commandes est la cha ne nulle (indique explicitement par '' : 2 apostrophes sleep 5
accoles), le signal est ignor. done
Si liste-commandes est absente, le signal sera  nouveau trait normalement.  trap
(sans aucun paramtre) ache la liste des commandes associes  chacun des signaux. (b) Le schma ci-dessous permet d'interrompre  commande en tapant la touche d'annu
La liste de commandes du trap est lue et interprte une premire fois quand le shell lation, sans interrompre le programme principal * l'excution reprend  la suite d
lit la ligne qui comprend la commande trap et le rsultat de la premire interprtation est programme.
interprte une deuxime fois si la liste de commande est excute aprs la rception d'un
signal. trap "trap '' 2" 2 # les guillemets pour entourer la chaine
134 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.7. RCURSIVIT DANS L'EXCUTION DES SHELLSCRIPTS 13
# avec les deux apostrophes Cette commande permet de lancer des processus en arrire-plan et d'en attendre certain
commande avant de continuer une action. Il peut tre utile de conserver le pid d'un processus lanc
trap '' 2 en arrire-plan dans une variable  l'aide de la variable spciale $! (voir 15.2.6).
Suite du programme...

Si le premier trap tait trap '' 2, on ne pourrait pas interrompre la commande. 17.7 Rcursivit dans l'excution des shellscripts
On pourrait aussi mettre trap : 2 comme premier trap mais il pourrait peut-tre
y avoir un problme si la touche d'annulation tait tape pendant l'excution du Un shellscript (ou une fonction) peut s'appeler lui-mme. Par exemple le shellscrip
deuxime trap (plac aprs la commande) : le signal 2 ne serait plus ignor dans la dirr suivant ache tous les sous-rpertoires de l'arborescence d'un rpertoire donn e
suite du programme. paramtre en dcalant les dirents niveaux de sous-rpertoires :
dir=${1-.}

17.6 Commandes internes diverses


indent=$2
for fich in `ls -A $dir`
do
: if  -d $dir/$fich ]# then
commande nulle (elle peut tre suivie de commentaires sur la mme ligne). Elle renvoie echo "$indent"$fich
le code 0 ce qui permet de construire des boucles in nies (voir exemple de while de la $0 $dir/$fich "$indent "
page 130). fi
eval chanes... done
les cha nes sont interprtes par le shell et elles sont ensuite excutes comme si elles avaient
t tapes au clavier (donc avec une nouvelle interprtation du shell). Cette commande Remarques 17.7
permet de construire des commandes complexes morceau par morceau et des les excuter (a) L'utilisation de $0 au lieu du nom du shellscript assure que le shellscript fonctionner
ensuite. Elle permet aussi des astuces qui sont lies  une double interprtation du shell mme si on change son nom.
comme dans l'exemple suivant.
(b) L'excution de ce shellscript risque de provoquer une erreur si l'arborescence d
Exemple 17.12 rpertoire est profonde et si la mmoire alloue  la pile est trop faible.
eval dernier='$'$#
aecte  la variable dernier la valeur du dernier paramtre de position du shellscript.
En eet, quand le shell lit la commande et l'interprte, la commande devient 17.8 Calculs, traitement des chanes de caractres
eval dernier=$3 ksh et zsh fournissent la commande interne let pour eectuer des calculs arithmtique
(s'il y avait par exemple 3 paramtres de position) car le shell eectue la substitution Cette commande n'existe pas dans sh mais on peut utiliser la commande expr.
de variable ($#). expr permet aussi d'extraire des sous-cha nes d'une cha ne de caractres.
La commande interne eval est ensuite lance : elle commence par interprter la
cha ne  dernier=$3 comme le ferait le shell. Cette cha ne devient  dernier=toto
(si toto est la valeur du troisime paramtre).
17.8.1 Commande expr
expr arguments...
L'aectation est ensuite excute et on obtient bien ce que l'on voulait. value les arguments comme une expression. Le rsultat est envoy sur la sortie standard
exec commande Ce n'est pas une commande interne au shell mais elle est trs utile dans l'criture d
la commande est excute  la place du shell sans cration de nouveau shell. shellscripts
On a vu en 16.4.2 que exec permet aussi de faire des redirections d nitives dans le Attention, sauf pour les options ci-dessous o- le code retour est indiqu, le code retou
shell. renvoy est 0 lorsque la valeur envoye sur la sortie standard est dirente de 0 et 1 si l
wait n] valeur est 0.
attend le processus ls de pid n. Si n n'est pas spci , attend tous les processus ls. Les calculs se font sur des entiers cods sur 32 bits en complment  2.
136 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.8. CALCULS, TRAITEMENT DES CHANES DE CARACTRES 13
arguments est une expression comprenant des oprateurs. On peut utiliser les oprateurs (b) Le programme suivant ache les nombres entiers de 1  9 :
suivants. Il ne faut pas oublier de les protger contre une interprtation du shell s'ils sont
des caractres spciaux pour le shell (par exemple, les caractres < > * & |). a=1
Voici ces oprateurs par ordre de priorit croissante, regroups par groupes d'gales while  $a -lt 10 ]
priorits : do
exp1 n j exp2 echo $a
si exp1 est non nulle et non vide, elle est envoye sur la sortie standard, sinon a=`expr $a + 1`
si exp2 est non nulle et non vide, elle est envoye sur la sortie standard, sinon done
0 est envoye sur la sortie standard.
exp1 n& exp2 (c) expr "$a" : ".*"
si exp1 et exp2 sont non nulles et non vides, exp1 est envoye sur la sortie ache le nombre de caractres de la cha ne contenue dans la variable a.
standard, sinon 0 est envoye sur la sortie standard.
exp1 op_comp exp2 (d) expr 123abc : '0-9]*'
o- op_comp est un oprateur de comparaison : ache 3.
< <= = != >= >
La comparaison est numrique si les deux expressions sont numriques * elle (e) Le shellscript option suivant ache le nombre n associ  une option -n. Il renvoi
est lexicographique sinon. Envoie 1 sur la sortie standard si l'expression est le code retour 1 si le paramtre ne commence pas par le caractre - :
vrai et 0 sinon. expr $1 : '-\(.*\)'
exp1 + exp2
exp1 - exp2 addition et soustraction 17.8.2 Commande let
exp1 n* exp2
exp1 / exp2 Cette commande n'existe pas en sh. Elle est disponible dans ksh et zsh.
exp1 n% exp2 multiplication, division et modulo let expression arithmtique
Autres arguments : permet d'aecter des valeurs numriques  une variable.
chane (une seule cha ne de caractre) envoie chane sur la sortie standard et le L'expression arithmtique doit tre un seul mot pour le shell (on peut l'entourer d
code retour 0 si chane est non vide * envoie une ligne vide et le code retour guillemets pour cela). Il ne faut pas faire prcder les noms des variables du shell par
1 si chane est vide. signe $ pour dsigner leur contenu.
chane : exp-reg Exemples 17.14
renvoie le nombre de caractres de chane qui peuvent tre dsigns par (a) let a=10+b
l'expression rgulire exp-reg (voir chapitre 11). exp-reg doit reprsenter le
dbut de chane et il ne faut donc pas commencer exp-reg par le caractre (b) let "a = 10 * a"
 ^.
Si une partie de l'expression rgulire est parenthse par \( et \), expr ((expression arithmtique))
renvoie la sous-cha ne de chane qui correspond  cette partie. Le code est quivalent 
retour 1 est renvoy si l'expression rgulire exp-reg ne correspond  aucune let "expression arithmtique"
sous-cha ne de chane et 0 sinon. (voir 14.8)
On peut regrouper les expressions en les parenthsant par ( et ). Exemples 17.15
(a) ((a=10+b))
Exemples 17.13 (b) ((a = 10 * a))
(a) a=`expr $a + 1`
incrmente a de 1. Pour des calculs plus complexes on utilisera la commande bc .
138 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.11. MISE AU POINT DES SHELLSCRIPTS (SET -XV) 13
17.9 Traitement des chanes de caractres met dans la variable du shell nom-variable la prochaine option et le numro de prochai
argument  traiter dans la variable OPTIND.
Le langage Perl permet d'eectuer de nombreuses manipulations sur les cha nes de La premire fois que getopts est appele, OPTIND vaut 1 et ensuite OPTIND est incrment
caractres. Le langage est complexe et n'est pas tudi dans ce cours. Son usage doit  chaque fois que l'on appelle getopts, au fur et  mesure du traitement des dirent
tre envisag pour les programmes qui comportent beaucoup de traitements de cha nes de paramtres. Si une des options ncessite un argument (comme l'option -P voque c
caractres. Il est en particulier trs utilis dans les programmes CGI (Common Gateway dessus), cet argument est rang dans la variable OPTARG.
Interface ) installs sur les serveurs Web (voir cours polycopis sur les rseaux). Si une option illgale est rencontre, nom-variable re'oit la valeur  ?.
La commande habituelle utilise pour la manipulation de cha nes de caractres est la Quand toutes les options ont t passes en revue, getopts renvoie un code retour no
commande expr (voir 17.8.1). nul. L'option spciale  -- peut indiquer la n des options (on peut ainsi indiquer u
Voici des mthodes (plus ou moins) simples pour extraire une sous-cha ne de caractres. argument qui n'est pas une option et qui commence par  -).
Pour ces exemples, on extrait l'heure les minutes et les secondes en utilisant la commande Les options acceptes sont indiques dans la cha ne options. Le caractre : est acco
date et la substitution de commande (voir 14.7) : derrire les options qui doivent tre suivies d'un complment.
heure=`date | cut -c12-19` Voici un exemple d'utilisation de getopt en dbut de shellscript. Ce shellscript est sup
heure=`date | awk '{print $4}'` pos accepter les options simples -a et -b et les options -s et -f avec des complments. O
heure=`date | read a b c d e# echo $d` notera que l'on analyse d'abord tous les paramtres avant de commencer les traitement
heure=`date | sed 's/^ ]* ^ ]* ^ ]* \(^ ]*\).*/\1/'` On n'est ainsi pas tributaire de l'ordre dans lequel l'utilisateur a donn les paramtres su
heure=`set \`date\` # echo $4` la ligne de commande.
heure=`expr "\`date\`" : '^ ]* ^ ]* ^ ]* \(^ ]*\)'` opta=0# optb=0# optf=0# opts=0
On peut aussi utiliser la variable . Voici des lignes de programme pour acher le
IFS fichier= # complement pour option -f
nom de la machine d'une adresse internet : sujet= # complement pour option -s
nom=samoa.unice.fr while getopts abs:f: argument
IFS=. do
set $nom case $argument in
echo $1 a) opta=1 ##
b) ooptb=1 ##

17.10 Aide pour traiter les options (getopts) f) optf=1


fichier="$OPTARG"##
s) opts=1
La commande getopts est une commande interne qui aide  rcuprer les valeurs des sujet="$OPTARG"##
paramtres de position des shellscripts dont la syntaxe suit la syntaxe habituelle des com- \?) echo "`basename $0`: Usage: \
mandes Unix. `basename $0` -ab] -s sujet] -f fichier-adresses message]" >&
On sait que les commandes Unix acceptent plusieurs formats dirents. On peut crire exit 2##
par exemple  ls -la ou  ls -l -a. Quand une option ncessite un complment, ce esac
complment peut tre accol  l'option ou spar de l'option par un espace ( -P1rv ou done
 -P 1rv par exemple). La rcupration des options d'un shellscript ncessite donc un shift `expr $OPTIND - 1`
traitement assez complexe. La commande getopts facilite grandement la t&che du pro-
grammeur. if  $optf -eq 0 ] # then
L'ancienne commande getopt eectuait le mme type de traitement mais ne fonctionnait ...
pas correctement ds qu'un des arguments tait compos de plusieurs mots (comme le
complment de l'option -s dans  mail -s "Sujet du message" toto).
getopts options nom-variable paramtres...] 17.11 Mise au point des shellscripts (set -xv)
getopts analyse les paramtres de position (ou la cha ne constitue de paramtres... si elle
est donne). getopts traite une  une toutes les options,  chaque fois qu'on le lance. Il set -v
140 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS
fait acher les lignes du shellscript au moment o- elles sont lues par le shell. set +v annule
cette option.
set -x
fait acher les commandes (et leurs arguments) au moment de leur excution, aprs l'in-
terprtation du shell. set +x annule cette option.
Ces commandes peuvent tre insres de part et d'autre des lignes que l'on veut suivre
Index
 la trace dans les shellscripts que l'on veut mettre au point.
Si on veut suivre  la trace l'excution entire d'un shellscript, le plus simple (car on #, 32 .zshenv, 111
vite de modi er le shellscript) est de lancer le shellscript par (on remplacera sh par zsh si #!, 101 .zshrc, 111
le shellscript doit tre excut par zsh ). $, 58 :, 118, 134
sh -x nom-shellscript
$!, 108 #, 113
ou
$#, 108 <, 94
sh -v nom-shellscript
$$, 108 <&n, 117
$(...), 98 <<, 115
$*, 108 =, 105
$?, 108 >, 93
$@, 108 >!, 94
$n, 104 >&n, 117
$variable, 105 >>, 94
${#variable}, 119 ?, 31, 59
${=variable}, 106 , 31, 59
${variable##modle}, 119  (test), 123
${variable#modle}, 119  ... ]], 124
${variable+mot}, 118 n, 31, 58, 99
${variable-mot}, 118 , 99
${variable=mot}, 118 n(...n), 60
${variable?mot} , 118 %n, 97
${variable%%modle}, 120 nn, 60
${variable%modle}, 119 n{m, n}, 60
${variable}, 106 n{m,nn}, 60
&, 96, 113 n{mn}, 60
^, 31
&&, 113 ^, 58
', 99 `, 98
((...)), 137 {...}, 96
(...), 95 j, 61, 95
*, 30, 59 jj, 113
+, 59  , 31
., 58, 102
.plan, 38 a2ps, 48
.project, 38 administrateur, 11
.zlogin, 111 aectation, 105
.zpro le, 111 acher, 108
141
142 INDEX INDEX 14
acher le contenu d'un chier, 44 continue, 131 exit, 19, 125, 131 interprtation du shell, 99
acher les octets d'un chier, 45 convertir des caractres, 75 export, 109 interprteur de commandes, 5
acher page  page, 45 copier des chiers, 50 expr, 135
alias, 97 copier l'arborescence d'un rpertoire, 56 expression conditionnelle, 124 jobs, 97
appels systme, 5 core, 13, 34 expression rgulire, 58 join, 88
arrire-plan, 13, 96 cp, 50, 56 extraire une sous-cha ne, 135 kill, 22, 42
at, 43, 96 cpio, 57 Korn-shell, 6
autorisations, 35, 36 crer un rpertoire, 55 false, 113
autorisations d'un chier, 15 csh, 6 fg, 97 ksh, 6
awk, 81 csplit, 88 chier lancer une commande, 22
cut, 76 type de, 7, 29 last, 38
batch, 96 chier inclus, 115 lecteur de disquettes, 53
bc, 137 daemon, 13 chier ordinaire, 7 lecture ligne  ligne d'un chier, 131
bg, 97 date, 37 chier spcial, 8, 29 let, 137
boucles rediriges, 131 dbut d'un chier, 79 le, 32 lien, 30, 52
Bourne shell, 6 dcaler les paramtres, 125 n d'un chier, 79 lien hard, 51
break, 131 demand paging, 12 nd, 32 lien symbolique, 52
dmon, 13 nger, 38 lien symbolique pour un rpertoire, 56
C-shell, 6 dpersonnaliser, 99 fold, 88 lignes conscutives distinctes, 79
calculs, 135 dplacer des chiers, 53 fonction, 114 lignes conscutives identiques, 79
calculs mathmatiques, 137 descripteur de chier, 116 for, 128 liste de commandes, 113
cancel, 47 df, 39 ln, 52, 56
caractres spciaux pour le shell, 30 di%, 78 gnration des noms de chiers, 30
case, 128 gestion des jobs, 97 locate, 34
dirences entre deux chiers, 78 getopt, 138 lpq, 47
cat, 44 DISPLAY, 112 lpr, 46
cd, 30 disquette, 53 getopts, 138
CDPATH, 107 grep, 74 lprm, 47
driver, 5, 29 groupe d'un chier, 15 lpstat, 46
CGI, 138 droits sur un chier, 16 ls, 27
cha ne de caractres, 135, 138 du, 39 groupe d'un processus, 13
chmod, 35 groupe d'utilisateurs, 9 mail, 48
cmp, 78 echo, 108 gzip, 54 majeur, 29
code retour, 78, 93, 125 ed, 115 head, 79 man, 21
comm, 88 diteur de texte, 62 historique de Unix, 3 mcopy, 53
commande externe, 6 eject, 53 HOME, 30, 106 mdir, 53
commande interne, 6, 92, 134 emacs, 62 hostname, 37 message d'erreur, 94
commentaire, 32 EMACSLOADPATH, 63 mineur, 29
comparer deux chiers, 78 entre standard, 93 i-node, 8, 14, 51 mise au point, 139
compatibilit de zsh, 92 environnement, 11, 92, 104, 109, 110, 119 identi cateur d'une variable, 105 mise en page, 48
compltion des commandes, 24 Envoyer un chier, 48 if, 125 mkdir, 55
compress, 54 erreur standard, 93 IFS, 107 mode dired d'emacs, 68
compter les caractres, mots et lignes, 74 eval, 134 imprimantes disponibles, 46 mode d'accs  un chier, 15
concatner plusieurs chiers, 44 excution d'un shellscript, 100 imprimer, 45 modi er la valeur d'une variable, 120
con gurer zsh, 92 exec, 116, 134 inhiber l'interprtation du shell, 99 monter un systme de chiers, 6
144 INDEX INDEX 14
more, 45 printenv, 110 set group id, 16 tri, 73
mot de passe, 18 PRINTER, 46 set user id, 16 true, 113
mv, 53, 55 processus, 11 setopt, 110 tty, 39
image, 11 sgid, 16 type d'un chier, 32
NFS, 7 processus en cours d'excution, 41 sh, 6 type de chier, 29
NIS, 18, 38 programme de dmarrage, 10 shell, 5, 91
NOCLOBBER, 94 prompt, 92 shell d'excution d'un shellscript, 101 uid, 9
nohup, 96 propritaire d'un chier, 15 shellscript, 6, 91, 100 umask, 36
nom absolu, 22 propritaire eectif, 13 shift, 125 unalias, 97
nom d'un chier, 22 propritaire rel, 13 signal, 12, 42, 132 uname, 37
nom d'une commande, 22 protection des chiers, 15 sleep, 130 uniq, 79
nom de l'ordinateur, 37 ps, 41 socket, 8 Unix BSD, 4
nom relatif, 22 PS1, 107, 120 Solaris, 4 Unix OSF, 4
noyau, 5 PS2, 107 sort, 73 Unix Systme V, 4
NULLCMD, 118 pseudo- chier, 95 sortie standard, 93 unset, 106
numro de job, 96 pwd, 30 split, 88 until, 131
numro de processus, 11 spool, 46 uuencode, 48
od, 45 racine, 22 substitution de commande, 98 valeur par dfaut d'une variable, 118
options read, 108 suid, 16 vared, 120
traitement, 138 recherche d'une cha ne, 74 super-utilisateur, 11 variable, 118
options des shells, 92, 110 recherche d'une commande, 100 supprimer des caractres, 75 dcomposition en mots sous zsh, 106
ordre de priorit, 114 recherche de chiers, 32 supprimer des chiers, 52 valeur par dfaut, 118
OSF, 4 rechercher le manuel en ligne, 23 supprimer des rpertoires, 55 variable de position, 104
rechercher une commande, 23 supprimer des requtes d'impression, 47 variable du shell, 105
paramtre, 104 rcursivit, 135 supprimer un processus, 22, 42 variable spciale du shell, 106
partition d'un disque, 6 redirection, 44, 93, 115, 116 supprimer une variable, 106
passwd, 18 redirection des erreurs, 94 suspendre un processus, 97 wait, 134
paste, 88 redirection sur chier inclus, 115 swap, 12 wc, 74
PATH, 22, 100, 107 regrouper des commandes, 95 systme d'exploitation, 3 whence, 23
PC (compatible), 53 renommer des chiers, 53 nom du, 37 whereis, 23
Perl, 82 renommmer un rpertoire, 55 systme d'impression, 46 while, 130
pid, 11, 96 rpertoire systme de chiers, 6 who, 37
pilote, 29 structure interne, 14 whoami, 37
pipe, 95 rpertoire courant, 12 tail, 79 write, 113
pipe nomm, 8 rpertoire HOME, 10 tar, 57
place libre d'un systme de chiers, 39 requte d'impression, 46 TERM, 107, 112 xemacs, 62
place occupe par un rpertoire, 39 return, 115 terminal de contrle, 13 xterm, 103
pliage de rpertoires, 57 rm, 52, 55 test, 123 Yellow Pages, 38
Postscript, 48 rmdir, 55 thread, 11 ypcat, 38
pr, 48 touche spciale, 19 yppasswd, 18
primitive, 5 sauvegarder sur disquette, 53 tr, 75
print, 108 sed, 80 traiter les options, 138 Z shell, 6
\subitem printcap, 46 set, 91, 104, 110, 139 trap, 132 zip, 54
146 INDEX
zone de swap, 12
zsh, 6, 92

Vous aimerez peut-être aussi