Unix et programmation du shell Table des mati res
Transcription
Unix et programmation du shell Table des mati res
TABLE DES MATIRE ii Table des matires Universit de Nice Sophia-Antipolis i Prsentation du polycopi I Connaissances de base Unix et programmation du shell Version 3.0 Richard Grin 31 juillet 1998 1 Gnralits sur Unix 1.1 1.2 1.3 1.4 1.5 Systmes d'exploitation . . . . . . . . Historique . . . . . . . . . . . . . . . Standards et versions d'Unix . . . . . Proprits d'Unix . . . . . . . . . . . Structure d'Unix . . . . . . . . . . . 1.5.1 Noyau . . . . . . . . . . . . . 1.5.2 Shell . . . . . . . . . . . . . . 1.6 Organisation des systmes de chiers 1.6.1 Systme de chiers . . . . . . 1.6.2 Types de chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Un utilisateur dans le systme . . . . . . . . . . . . . . . . . . 2.1.2 Super-utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.3 Administrateur du systme . . . . . . . . . . . . . . . . . . . . 2.2 Processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Signaux envoys aux processus . . . . . . . . . . . . . . . . . . 2.2.2 Terminal de contrle d'un processus, excution en arrire-plan 2.2.3 Propritaires et groupes eectifs et rels d'un processus . . . . 2.2.4 Cration d'un nouveau processus, arbre des processus . . . . . 2.3 Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 i-node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2 Structure interne des rpertoires . . . . . . . . . . . . . . . . . 2.3.3 Propritaire et groupe d'un chier . . . . . . . . . . . . . . . . 2.3.4 Mode d'accs au chier . . . . . . . . . . . . . . . . . . . . . . 2.4 Protection des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Acteurs/objets du monde Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 TABLE DES MATIRES 2.4.1 Droits associs aux autorisations . . . . . . . . . . . . . . . . . . . 2.4.2 Autorisations set user id et set group id . . . . . . . . . . . . . . 2.4.3 Mcanisme de protection des chiers . . . . . . . . . . . . . . . . . 3 Premiers pas dans le systme 3.1 Entre dans le systme . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Changer son mot de passe (passwd) . . . . . . . . . . . . 3.1.2 Dmarrage d'une session . . . . . . . . . . . . . . . . . . 3.2 Sortie du systme . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Touches spciales . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Format des commandes Unix . . . . . . . . . . . . . . . . . . . . 3.5 Consultation du manuel en ligne (man) . . . . . . . . . . . . . . 3.6 Nom d'un chier, nom absolu, nom relatif . . . . . . . . . . . . 3.7 Commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7.1 Lancer une commande, supprimer un processus . . . . . 3.7.2 Nom d'une commande, variable PATH . . . . . . . . . . 3.7.3 Nom complet et type d'une commande (whence, whereis) 3.7.4 Compltion des commandes par zsh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv 16 16 17 6 Commandes d'observation du systme 18 18 18 19 19 19 20 21 22 22 22 22 23 24 II Commandes 25 4 Commandes lies l'arborescence des chiers 27 4.1 Visualisation de l'arborescence (ls) . . . . . . . . . . . . 4.2 Information dtaille sur les chiers (ls -l) . . . . . . . . 4.2.1 Format d'achage . . . . . . . . . . . . . . . . . 4.2.2 Types de chiers . . . . . . . . . . . . . . . . . . 4.2.3 Mode d'accs au chier . . . . . . . . . . . . . . . 4.2.4 Nombre de liens . . . . . . . . . . . . . . . . . . . 4.3 Se dplacer dans l'arborescence (cd) . . . . . . . . . . . . 4.4 Acher le rpertoire courant (pwd) . . . . . . . . . . . . 4.5 Caractres spciaux pour le shell . . . . . . . . . . . . . 4.5.1 Gnration des noms de chiers (*,?, ) . . . . . . 4.5.2 Le caractre spcial . . . . . . . . . . . . . . . 4.5.3 Le caractre spcial # . . . . . . . . . . . . . . . 4.5.4 Autres caractres spciaux . . . . . . . . . . . . . 4.6 Acher le type d'un chier (le) . . . . . . . . . . . . . . 4.7 Rechercher des chiers dans l'arborescence (nd, locate) 5 Protection des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 Changement des autorisations (chmod) . . . . . . . . . . . . . . . . . . . . 5.2 Masque pour les autorisations (umask) . . . . . . . . . . . . . . . . . . . . TABLE DES MATIRE iii 27 28 28 29 29 30 30 30 30 30 31 32 32 32 32 35 35 36 6.1 6.2 6.3 6.4 6.5 6.6 6.7 Date et Heure (date) . . . . . . . . . . . . . . . . . . . . Nom de l'ordinateur (hostname) . . . . . . . . . . . . . . Nom du systme d'exploitation (uname) . . . . . . . . . Information sur les utilisateurs (who, nger) . . . . . . . Dernires connexions au systme (last) . . . . . . . . . . Systme Network Information Service (NIS) . . . . . . Espace disque occup . . . . . . . . . . . . . . . . . . . . 6.7.1 Place occupe par la branche d'un rpertoire (du) 6.7.2 Place libre d'un systme de chiers (df) . . . . . . 6.8 Nom du terminal utilis (tty) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 3 3 3 3 3 3 3 7 Commandes pour la gestion des processus 4 8 Acher, imprimer, envoyer le contenu d'un chier 4 7.1 7.2 7.3 7.4 Processus en cours d'excution (ps) . . . . . . . . . . . . . . . . . . . . . . Supprimer un processus en cours d'excution (kill) . . . . . . . . . . . . . . Lancement automatique de processus des moments donns (at, crontab) . Gestion du plan d'un processus par le shell . . . . . . . . . . . . . . . . . . 8.1 Acher le contenu d'un chier, concatner plusieurs chiers (cat) - Notion de redirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Acher les octets d'un chier (od) . . . . . . . . . . . . . . . . . . . . . . 8.3 Acher page page (more) - Notion de pipe . . . . . . . . . . . . . . . . . 8.4 Sorties sur les imprimantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.1 Informations sur le systme d'impression (lpstat, printcap) . . . . . 8.4.2 Lancement d'une requte d'impression (lpr) . . . . . . . . . . . . . 8.4.3 Informations sur les requtes d'impression (lpq) . . . . . . . . . . . 8.4.4 Suppressions de requtes d'impression (lprm, cancel) . . . . . . . . 8.5 Envoyer le contenu d'un chier (mail) . . . . . . . . . . . . . . . . . . . . . 8.6 Mise en page (pr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.7 Passer en Postscript (a2ps) . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Gestion des chiers 9.1 9.2 9.3 9.4 9.5 9.6 9.7 Copier des chiers (cp) . . . . . . . . . . . . . . . . . . . . Liens avec mme numro de i-node (ln) . . . . . . . . . . . Liens symboliques (ln -s) . . . . . . . . . . . . . . . . . . . Supprimer des chiers (rm) . . . . . . . . . . . . . . . . . Dplacer, renommer des chiers (mv) . . . . . . . . . . . . Sauvegarder sur les lecteurs de disquettes des stations Sun Compression et dcompression (zip, gzip, compress) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 TABLE DES MATIRES v 10 Travail sur les rpertoires 10.1 10.2 10.3 10.4 10.5 10.6 Crer un rpertoire (mkdir) . . . . . . . . . . . . Supprimer un rpertoire (rmdir, rm -r)) . . . . . . Changer le nom d'un rpertoire (mv) . . . . . . . Copier l'arborescence d'un rpertoire (cp -r) . . . Lien symbolique (ln -s) . . . . . . . . . . . . . . . Pliage de rpertoires en une seul chier (tar, cpio) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Expressions rgulires 55 55 55 55 56 56 57 58 11.1 Expressions rgulires reprsentant un seul caractre . . . . . . . . . . . . 58 11.2 Expressions rgulires reprsentant un ensemble de caractres d'un seul type 59 11.3 Autres expressions rgulires . . . . . . . . . . . . . . . . . . . . . . . . . . 60 12 diteur de texte (emacs, xemacs) 12.1 Entre et sortie . . . . . . . . . . . . . . . 12.1.1 Lancer emacs . . . . . . . . . . . . 12.1.2 Sortir de emacs . . . . . . . . . . . 12.2 Concepts de base . . . . . . . . . . . . . . 12.2.1 Description d'une fentre emacs . . 12.2.2 Commandes et associations de cls 12.2.3 Buers et fentres . . . . . . . . . . 12.2.4 Point d'insertion, marque, rgions . 12.2.5 Mode de travail . . . . . . . . . . . 12.3 Commandes . . . . . . . . . . . . . . . . . 12.3.1 Commandes de base . . . . . . . . 12.3.2 Autres commandes . . . . . . . . . 12.4 Personnalisation de emacs . . . . . . . . . 12.5 Complments pour les versions graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tri (sort) . . . . . . . . . . . . . . . . . . . . . . Recherche d'une cha ne de caractres (grep) . . . Compter les caractres, les mots, les lignes (wc) . Conversion, suppression de caractres (tr) . . . . Fractionnement vertical (cut) . . . . . . . . . . . Comparaison du contenu de 2 chiers . . . . . . . 13.6.1 Dirences entre deux chiers texte (di) . 13.6.2 !galit du contenu de 2 chiers (cmp) . . 13.7 Traiter les lignes conscutives identiques (uniq) . 13.8 Extraire le dbut ou la n d'un chier . . . . . . . 13.8.1 Dbut d'un chier (head) . . . . . . . . . . 13.8.2 Fin d'un chier (tail) . . . . . . . . . . . . 13.9 Un diteur non interactif (sed) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Manipulation des donnes des chiers 13.1 13.2 13.3 13.4 13.5 13.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 62 62 63 63 63 64 66 67 68 68 68 71 71 72 73 73 74 74 75 76 78 78 78 79 79 79 79 80 TABLE DES MATIRE vi 13.9.1 Description gnrale de l'diteur . . . . . . . . 13.9.2 Structure d'une ligne de programme . . . . . . 13.9.3 Format pour indiquer les lignes traiter . . . 13.9.4 Excution du programme . . . . . . . . . . . . 13.9.5 Commandes . . . . . . . . . . . . . . . . . . . 13.10Un langage d'dition de chiers (awk) . . . . . . . . . 13.10.1Description gnrale de la commande . . . . . 13.10.2Champs . . . . . . . . . . . . . . . . . . . . . 13.10.3Structure d'un programme . . . . . . . . . . . 13.10.4Cas particuliers pour une ligne de programme 13.10.5Slecteurs . . . . . . . . . . . . . . . . . . . . 13.10.6Actions . . . . . . . . . . . . . . . . . . . . . 13.10.7Fonctions, oprateurs . . . . . . . . . . . . . . 13.11Exemples de programmes . . . . . . . . . . . . . . . . 13.12Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . 13.13D'autres commandes de manipulation de chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III Mcanismes d'interprtation du shell 14 Interprtation du shell. Mcanismes de base 14.1 Gnralits sur le shell . . . . . . . . . . . . . . . . . . . . . . 14.1.1 Dnition . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.2 Compatibilit des dirents shells . . . . . . . . . . . . 14.1.3 Commandes et processus, commandes internes au shell 14.1.4 Prompts . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1.5 Environnement d'une commande ou d'un shellscript . . 14.1.6 Code retour d'une commande . . . . . . . . . . . . . . 14.2 Redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.2.1 Redirections de la sortie standard . . . . . . . . . . . . 14.2.2 Redirection du chier d'erreur (2>) . . . . . . . . . . . 14.2.3 Envoi d'un message d'erreur (>&2) . . . . . . . . . . . 14.2.4 Redirection de l'entre standard (<) . . . . . . . . . . 14.2.5 Pseudo-chier /dev/null . . . . . . . . . . . . . . . . . 14.3 Pipe (j) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.4 Regroupement des commandes . . . . . . . . . . . . . . . . . . 14.4.1 Regroupement entre parenthses . . . . . . . . . . . . . 14.4.2 Regroupement entre accolades . . . . . . . . . . . . . . 14.5 Processus en arrire-plan (&) . . . . . . . . . . . . . . . . . . 14.5.1 Gestion des jobs par ksh ou zsh . . . . . . . . . . . . 14.6 Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.7 Substitution de commande . . . . . . . . . . . . . . . . . . . . 14.8 Mcanismes d'interprtation . . . . . . . . . . . . . . . . . . . 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 TABLE DES MATIRES 14.9 Inhiber l'interprtation du shell . . . . . . . . . . . . . . 14.10Recherche d'une commande par le shell . . . . . . . . . . 14.11Lancement de l'excution d'un shellscript . . . . . . . . . 14.11.1Lancement par le nom du shellscript . . . . . . . 14.11.2Lancement par l'appel de la commande interne . 14.11.3Lancement par l'appel explicite d'un shell . . . . 14.12Lancement explicite d'un shell . . . . . . . . . . . . . . . vii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.1 Paramtres, variables de position . . . . . . . . . . . . . . . . . 15.1.1 Paramtres des shellscripts . . . . . . . . . . . . . . . . . 15.1.2 Donner des valeurs aux paramtres de position (set) . . . 15.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15.2.1 Identicateur . . . . . . . . . . . . . . . . . . . . . . . . 15.2.2 Aectation . . . . . . . . . . . . . . . . . . . . . . . . . 15.2.3 Dsignation de la valeur de la variable ($) . . . . . . . . 15.2.4 Dcomposition en mots des valeurs des variables de zsh . 15.2.5 Supprimer une variable (unset) . . . . . . . . . . . . . . 15.2.6 Variables spciales du shell . . . . . . . . . . . . . . . . . 15.2.7 Acher la valeur d'une variable (echo) . . . . . . . . . . 15.2.8 Entre de la valeur d'une variable au clavier (read) . . . 15.2.9 Porte d'une variable (export), environnement de travail 15.2.10Visualisation des variables disponibles (set, printenv) . . 15.3 Personnalisation de l'environnement . . . . . . . . . . . . . . . . 15.3.1 Options des shells (set, setopt) . . . . . . . . . . . . . . . 15.3.2 Fichiers de personnalisation . . . . . . . . . . . . . . . . 15.4 Stratgie pour la personnalisation de l'environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listes de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ordre de priorit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Complments sur les redirections . . . . . . . . . . . . . . . . . . . . . . 16.4.1 Redirection de l'entre standard sur chier inclus (<<) . . . . . . 16.4.2 Redirection pour tout un shell (exec) . . . . . . . . . . . . . . . . 16.4.3 Descripteurs de chier suprieurs 2 . . . . . . . . . . . . . . . . 16.4.4 Redirection vers un chier dsign par son descripteur . . . . . . . 16.4.5 Ordre d'valuation des redirections . . . . . . . . . . . . . . . . . 16.4.6 Redirection sans commande avec zsh . . . . . . . . . . . . . . . . 16.5 Complments sur les variables . . . . . . . . . . . . . . . . . . . . . . . . 16.5.1 Valeurs par dfaut pour les variables . . . . . . . . . . . . . . . . 16.5.2 Modier l'environnement d'une commande . . . . . . . . . . . . . 16.5.3 Facilits de ksh et zsh pour le traitement des valeurs de variables . . . . . . . . . . . . . . 15 Variables, environnement 16 Complments sur le shell 16.1 16.2 16.3 16.4 . . . . . . . . . . . . . . . . . . . . . 99 100 100 100 102 102 103 104 104 104 104 105 105 105 105 106 106 106 108 108 109 110 110 110 110 112 113 113 114 114 115 115 116 116 117 117 118 118 118 119 119 TABLE DES MATIRE viii 16.5.4 Modication interactive de la valeur d'une variable sous zsh (vared) 12 16.5.5 Tableaux sous ksh et zsh . . . . . . . . . . . . . . . . . . . . . . . . 12 IV Programmation 17 Programmation des shellscripts 17.1 17.2 17.3 17.4 Tests divers (test, ... ], ... ]]) . . . . . . . . . . . . . . Dcaler les paramtres de position (shift) . . . . . . . . . Sortie d'un shellscript (exit) . . . . . . . . . . . . . . . . Les structures de contrle . . . . . . . . . . . . . . . . . 17.4.1 if .. then .. else .. . . . . . . . . . . . . . . . . . 17.4.2 case ... esac . . . . . . . . . . . . . . . . . . . . . 17.4.3 for ... do ... done . . . . . . . . . . . . . . . . . . 17.4.4 while ... do ... done . . . . . . . . . . . . . . . . . 17.4.5 until ... do ... done . . . . . . . . . . . . . . . . . 17.4.6 Instructions lies aux boucles (continue, break) . 17.4.7 Problmes avec les boucles rediriges et les pipes . 17.5 Interception des signaux . . . . . . . . . . . . . . . . . . 17.6 Commandes internes diverses . . . . . . . . . . . . . . . 17.7 Rcursivit dans l'excution des shellscripts . . . . . . . 17.8 Calculs, traitement des cha nes de caractres . . . . . . . 17.8.1 Commande expr . . . . . . . . . . . . . . . . . . 17.8.2 Commande let . . . . . . . . . . . . . . . . . . . . 17.9 Traitement des cha nes de caractres . . . . . . . . . . . 17.10Aide pour traiter les options (getopts) . . . . . . . . . . 17.11Mise au point des shellscripts (set -xv) . . . . . . . . . . 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 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 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 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 lmentaires 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 lectronique l'adresse [email protected], en prcisant le sujet Poly Unix et programmation du shell et la date de la version du polycopi. Premire partie Connaissances de base 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. CHAPITRE 1. GNRALITS SUR UNIX 4 1979 Unix Version 7. Commercialisation d'une licence binaire (moins onreuse que la licence pour le code source). 1.5. STRUCTURE D'UNIX SHELLSCRIPTS 1984 Unix Systme V 1991 Unix OSF/1 SHELL NOYAU UNIX MATERIEL 1.3 Standards et versions 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 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 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 vers l'autre. Les direntes versions d'Unix taient issues de Systme V de AT&T ou de Unix BSD de l'universit de Berkeley. Au dbut des annes 1990, Open Software Fondation (OSF) a 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 dveloppeur 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. La tendance actuelle est au rapprochement des direntes versions d'Unix, au moins au niveau de l'utilisateur et du dveloppeur, autour de normes dnies par des groupements d'utilisateurs, des constructeurs d'ordinateurs ou des diteurs de logiciels. Ces normes spcient des interfaces : elles dnissent les signatures et smantiques (mais pas les implmentations) des fonctions qui constituent ces interfaces. Les trois normes principales sont SVID (System V Interface Denition), POSIX (Portable Operating System based on unIX) de l'IEEE et CAE (Common Applications Environment) de X/Open. 1.4 Proprits d'Unix Unix est un systme d'exploitation ) d'usage gnral, ) multi-utilisateurs, multi-t&ches, ) interactif, ) orient temps partag, APPLICATIONS Fig. 1.1 ) Structure d'Unix ) portable, ) dont les systme de chiers sont hirarchiss en arbre, ) qui ore une compatibilit totale des entres-sorties (pour Unix, les priphrique sont des chiers * voir 1.6.2), ) pour lequel il est trs facile d'ajouter de nouvelles commandes sans modier le noya (gr&ce la grande puissance des langages des shells). 1.5 Structure d'Unix 1.5.1 Noyau Le noyau est la partie centrale d'Unix. Il se charge des t&ches essentielles pour la bonn marche du systme : gestion du systme des chiers, gestion du processeur et de la mmoir centrale. Les drivers de priphriques sont intgrs au noyau. Ils grent les changes (le entres-sorties) entre l'unit centrale et les priphriques. Le noyau met la disposition des autres programmes des procdures appeles primitive Les autres programmes peuvent inclure dans leur code des appels systme qui lancen 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). 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 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 est termin. 1.5.2 Shell Le shell est l'interprteur de commandes. Quand un utilisateur tape des commande Unix, ces commandes sont lues par le shell qui eectue ventuellement des traitement CHAPITRE 1. GNRALITS SUR UNIX 6 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, ) 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 commandes) et il comprend aussi d'autres commandes et fonctionnalits qui facilitent le travail de l'utilisateur comme, par exemple, la gestion de l'historique des commandes tapes par l'utilisateur, qui existe aussi dans le C-shell. On le trouve maintenant dans la plupart des distributions Unix. ) 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 une erreur, par exemple lorsqu'une commande a t mal orthographie. Certaines commandes la disposition de l'utilisateur, sont programmes dans le shell et celui-ci peut donc les excuter directement. Elles sont peu nombreuses * on trouve par exemple les commandes cd ou pwd. On les appelle les commandes internes au shell. Les 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. Le shell possde un vritable langage avec des structures de programmation (alternatives, rptitions,...) et l'utilisateur peut crire ses propres commandes dans ce langage (le programme s'appelle un shellscript). Une fois crites, ces nouvelles commandes peuvent tre utilises exactement comme les commandes classiques d'Unix. Le shell que nous utiliserons est zsh. 1.6 Organisation des systmes de chiers 1.6.1 Syst me de chiers 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 chiers), et de chiers ordinaires qui contiennent des donnes et des programmes. 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 enregistrs sur des disques physiques dirents ou sur un mme disque mais sur des partitions direntes (un disque physique peut tre divis en plusieurs disques logiques appels partitions). Tous ces systmes de chiers sont vus par l'utilisateur comme un seul systme. dev etc usr students classe1 Commandes et fichiers système Commandes tmp Commandes Fichiers spéciaux (périphériques) bin bin classe2 bibi ucb local lib Commandes bin emacs lib toto Commandes bin Fichiers de l’étudiant toto Commandes de l’étudiant toto Fig. 1.2 ) Arborescence des chiers Des utilitaires de rseaux (comme NFS) permettent mme de voir des systmes implant sur des machines direntes comme s'ils appartenaient une mme arborescence. L'arborescence totale ressemble l'arborescence de la gure 1.2. 1.6.2 Types de chiers Unix utilise les types de chiers suivants : chiers ordinaires : ils contiennent les donnes ou les programmes. Ils n'ont aucun structure particulire : ils sont considrs comme une suite d'octets. Il n'y a pa de notion d'enregistrement ni d'accs par index. Si on veut un squentiel index, o 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). 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 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). rpertoires : ils sont les noeuds de la structure arborescente des chiers. Ils contiennent les identicateurs (i-nodes) d'autres chiers. Ils correspondent des sous-bibliothques ou dossiers qui contiennent d'autres 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 les changes avec les priphriques : disques, terminaux, imprimantes, streamers, lecteurs de bandes, etc. liens symboliques : ils contiennent le nom d'un autre chier et permettent des indirections. sockets : ils sont utiliss pour les liaisons inter-processus * ils ne seront pas tudis ici. Unix Systme V utilise aussi les pipes nomms qui sont utiliss pour la communication entre les processus. Ils ne seront pas tudis ici. Chapitre 2 Acteurs/objets du monde Unix Ce chapitre expose quelques notions et concepts de base sur le fonctionnement d'Unix Les commandes associes ces notions seront tudies dans les chapitres suivants. Les acteurs/objets principaux que l'on rencontre en Unix sont les utilisateurs, les pro cessus et les chiers. 2.1 Utilisateurs 2.1.1 Un utilisateur dans le syst me Nom, mot de passe, uid Un utilisateur est repr par son nom qu'il doit taper au moment de l'entre dans systme. Chaque nom correspond un numro d'utilisateur (un nombre entier) : le uid (use 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 dnie. Un utilisateur s'authentie 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). CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 10 Les groupes ne sont pas grs de la mme fa'on par les dirents types d'Unix. Nous n'tudierons pas cette notion en dtails dans ce cours. Rpertoire HOME 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. 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 deuxime anne d'informatique aura le rpertoire HOME /students/info2/jean. Programme de dmarrage 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. Attributs d'un utilisateur En rsum, chaque utilisateur est associ : ) un nom, ) un mot de passe, ) un uid, ) un ou plusieurs groupes, ) un rpertoire HOME, ) un programme de dmarrage. Fichiers systme Les informations sur un utilisateur sont enregistres dans le chier /etc/passwd. Pour des raisons de scurit ou de commodit (pour grer un rseau de machines), l'administrateur peut ajouter des utilitaires de gestion du systme (Yellow pages ou NIS, Kerberos, etc.). Dans ce cas, le chier /etc/passwd peut ne pas contenir toutes les informations concernant les utilisateurs (par exemple, les mots de passe sont remplacs par *) ou mme aucune information sur certains utilisateurs (ces informations ne sont enregistres que sur certaines machines du rseau * voir en particulier 6.6). 2.2. PROCESSUS 1 2.1.2 Super-utilisateurs 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 passe des autres utilisateurs et changer les autorisations ou le propritaire de n'import quel chier de l'arborescence. 2.1.3 Administrateur du syst me Un systme Unix doit tre gr par un administrateur qui est responsable du bo fonctionnement du systme. Voici quelques unes de ses t&ches : ) enregistrer les nouveaux utilisateurs et crer leur environnement de travail, ) installer les nouvelles versions des logiciels, ) reprer les problmes qui empchent le systme de fonctionner correctement, ) nettoyer priodiquement le disque des chiers non utiliss, ) eectuer rgulirement des sauvegardes des donnes et des programmes. Pour beaucoup des t&ches qu'il doit accomplir, l'administreur doit entrer dans le systm comme super-utilisateur. 2.2 Processus L'unit d'excution est le processus. Toute action est excute par un processus. Tous le 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 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 identier ). Une commande tape par l'utilisateur peut engendrer un ou plusieurs processus, o 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 assez court (environ un centime de seconde) pour que l'utilisateur ne s'aper'oivent pa de la prsence des autres processus pendant les priodes d'interaction avec le programm (entres-sorties avec le clavier ou avec la souris). Un processus travaille dans son propre environnement (en particulier avec ses propre variables). A un moment donn, son environnement est reprsent par une image qui es une sorte de clich (au sens photographique) du processus. 1. mme si la machine est a plusieurs processeurs, ceux-ci sont habituellement bien moins nombreu que les processus CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 12 L'image d'un processus est compose de : ) son code ) les donnes associes (traites par le code) ) les chiers ouverts et leur tat ) le rpertoire courant ) les informations du systme sur le processus (propritaire, terminal associ, etc.) On remarquera en particulier qu' un moment donn de son excution un processus a un rpertoire courant o- il est situ. Tout le code du programme n'est pas ncessairement en mmoire durant l'excution. Le code est dcoup en pages par le systme et seules les pages ncessaires sont charges en mmoire centrale. Au cours de l'excution du programme des pages peuvent tre transportes du disque vers la mmoire centrale si la page n'est plus ncessaire et que le systme a besoin de place en mmoire centrale, et faire le chemin inverse lorsque la page est ncessaire l'excution du programme. Ce systme de gestion de la mmoire s'appelle le demand paging . La zone du disque rserve ces allers et retours s'appelle la zone de swap . 2.2.1 Signaux envoys aux processus Durant son excution, un processus peut recevoir un signal. La plupart des signaux interrompent l'excution du processus mais celui-ci peut les intercepter. Il peut alors effectuer un traitement spcial et choisir ensuite de continuer s'excuter ou d'arrter son excution (voir 7.2 et 17.5). Les signaux peuvent tre envoys par : ) un processus, avec la commande ou l'appel systme kill (voir 7.2), ) le noyau, engendrs par la frappe d'une touche du clavier par l'utilisateur pour interrompre (ou stopper momentanment) tous les processus lis au terminal (notion tudie en 2.2.2), ) le noyau, engendrs par des erreurs venant du matriel ou du logiciel. Voici quelques numros, noms et descriptions de signaux utiles conna tre (on les trouve dans le chier /usr/include/signal.h) : 2.2. PROCESSUS 1 1 HUP (hangup ) envoy ses processus quand on sort de la session de travail ou quand se dconnecte par un modem 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) 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 15 TERM (terminate ) envoy par dfaut par la commande kill (voir 7.2). Pour terminer un processus d'une manire lgante si possible 18 TSTP suspend un processus (touche Ctrl Z) 19 CONT pour continuer aprs une suspension 2.2.2 Terminal de contrle d'un processus, excution en arri re plan Les processus lancs par un utilisateur restent lis au terminal d'o- ils ont t lanc appel terminal de contrle du processus. Le systme peut ainsi reprer les processus qu recevront le signal engendr par la frappe de la touche d'annulation ou les processus qu seront arrts si l'utilisateur teint son terminal. Un utilisateur peut lancer certains processus en arrire-plan (voir 14.5). Ces processu deviennent indpendants du terminal : ils s'excutent sans intervention de l'utilisateur e 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 par la commande kill (voir 7.2). Ils ne peuvent pas lire les caractres taps sur le termina mais ils peuvent toujours y crire. Des processus peuvent tre lancs automatiquement par le systme, en arrire-pla (comme le systme de spool pour l'impression tudi en 8.4). Ces processus sont appe ls des daemons, acronyme de l'anglais deferred auxiliary execution monitor c'est--dir programme de contrle d'excution dire. On les appelle souvent dmons en fran'ais 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 est l'utilisateur qui a lanc la commande qui a gnr les processus. Le propritaire eect dtermine les droits du processus dans le systme et en particulier les actions autorise sur les chiers (voir 2.4). Le plus souvent le propritaire eectif est le propritaire rel. Il existe une exceptio 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 commande qui a gnr les processus) et un groupe eectif (voir 2.4.2). Nous n'tudieron pas ces notions en dtails dans ce cours. CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 14 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 ainsi un arbre gnalogique des processus crs dans une session. Les pid ainsi que les pid des parents de tous les processus sont achs par la commande ps. Au moment de sa cration, le propritaire d'un chier est l'utilisateur qui l'a cr. Seu un super-utilisateur (voir 2.1.2) peut changer le propritaire d'un chier. 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 dans ce cours. 2.3 Fichiers Les donnes (que l'on veut conserver entre deux sessions) et les programmes sont enregistrs dans des chiers. On a vu en 1.6 que Unix utilise aussi la notion de chier pour organiser l'ensemble des chiers (rpertoires) et pour travailler avec les priphriques (chiers spciaux). 2.3.1 i-node Outre le contenu du chier, le systme conserve d'autres informations (par exemple le propritaire) sur chacun des chiers de l'arborescence. Ces informations lui seront utiles pour la gestion et la scurit du systme. Ces informations 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 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 sont ranges. 2.3.2 Structure interne des rpertoires La liaison entre les noms des chiers et les informations enregistres dans le i-node du chier se fait gr&ce aux rpertoires. 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 directement sous ce rpertoire dans l'arborescence des chiers. Les informations concernant un chier sont donc conserves dans trois endroits dirents : ) le nom du chier est conserv dans le rpertoire contenant le chier, ) les informations systme sont conserves dans le i-node du chier, ) le contenu du chier (les donnes) est enregistr dans les blocs du disque dont les adresses sont dans le i-node. 2.3.4 Mode d'acc s au chier A chaque chier sont attaches les autorisations pour le propritaire du chier, pou 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 commande ls -l (voir gure 4.2 et section 4.2) juste aprs le type du chier. Les autorisations peuvent tre (leur signication exacte sera tudie en 2.4.1) : ) l'autorisation de lecture (r pour la commande ls -l ) l'autorisation d'criture (w pour la commande ls -l ) l'autorisation d'excution (x pour la commande ls ) ) ) -l Il existe aussi des autorisations spciales rserves certains chiers excutables (elle accordent des droits spciaux aux processus qui excutent ces chiers * elles sont tudie en dtail en 2.4.2) : ) set user id * suid en abrg (s la place du x dans les autorisations du propritair pour la commande ls -l) ) set group id * sgid en abrg (s la place du x dans les autorisations du group pour la commande ls -l) 2.4 Protection des chiers La protection des chiers en Unix est fonde sur les droits des processus sur les 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 droit de lire le contenu d'un chier mais pas de supprimer ce chier. Nous allons examine dans cette section comment sont dtermins les droits d'un processus sur un chier. 16 CHAPITRE 2. ACTEURS/OBJETS DU MONDE UNIX 2.4.1 Droits associs aux autorisations Les autorisations qui constituent le mode d'accs au chier ne dnissent pas toujours d'une fa'on vidente les actions qu'un processus a le droit d'excuter sur le chier. Par exemple, un processus peut avoir le droit de supprimer un chier sans avoir l'autorisation w sur ce chier. On peut aussi s'interroger sur la signication de l'autorisation x pour un rpertoire. L'autorisation de lecture correspond au droit de lire le contenu du chier, l'autorisation d'criture correspond au droit d'crire dans le chier, l'autorisation d'excution correspond au droit d'excution du chier si le chier n'est pas un rpertoire et au droit de travailler dans son arborescence si le chier est un rpertoire. Pratiquement, on a le tableau suivant : Type de Fichier Fichier ordinaire Rpertoire Autorisation Lecture r lire le contenu du chier lister les sous-chiers Ecriture w modier le contenu du chier ajouter, enlever des souschiers 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 modication 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 modier : seul le super-utilisateur root a le droit de modier 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 modier que son propre mot de passe). Il rcupre ses droits de simple utilisateur ds la n de l'excution de la commande passwd. 2.4. PROTECTION DES FICHIERS 2.4.3 Mcanisme de protection des chiers 1 On a vu en 2.4.1 les actions qu'un processus a le droit d'eectuer sur un chier * elle dpendent des autorisations que ce processus a sur le chier lui-mme et sur les rpertoire parents de ce chier. Voici les rgles qui dterminent les autorisations d'un processus su un chier : ) si le propritaire eectif du processus et le propritaire du chier sont les mmes, le autorisations du processus sont les autorisations du chier accordes au propritair ) sinon, si le groupe du chier est le groupe eectif du processus ou l'un des groupe de l'utilisateur chier, les autorisations du processus sont les autorisations du chie accordes au groupe, ) sinon, les autorisations du processus seront celles accordes aux autres. CHAPITRE 3. PREMIERS PAS DANS LE SYSTME 18 Chapitre 3 Premiers pas dans le systme Ce chapitre donne quelques informations utiles pour commencer travailler dans un systme Unix. Certaines notions voques sont dveloppes dans la suite du cours (par exemple, les chiers de conguration du shell). 3.1 Entre dans le systme Lorsqu'un terminal est allum, certains processus sont automatiquement lancs par le systme pour grer les entres et les sorties depuis ce terminal. En particulier, un processus est lanc pour attendre l'entre d'un nom d'utilisateur et d'un mot de passe. Le nom d'utilisateur est attribu par l'administrateur du systme. 3.1.1 Changer son mot de passe (passwd) 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. passwd 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), les mots de passe (et plusieurs autres chiers utiliss par le systme) de plusieurs machines sont centraliss sur une seule machine. La commande pour changer le mot de passe est alors yppasswd qui a la syntaxe : yppasswd nom-login L'utilisateur doit entrer l'ancien mot de passe avant de donner le nouveau. Pour viter des fautes de frappe (impossibles voir puisque le mot de passe ne s'ache pas l'cran), le nouveau mot de passe doit tre entr deux fois. Seul le propritaire du mot de passe (ou le super utilisateur) peut entrer un nouveau mot de passe. Le mot de passe doit comporter au moins 6 caractres. 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 modication du mot d passe intervalles rguliers. 3.1.2 Dmarrage d'une session 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), - le rpertoire HOME devient le rpertoire courant, - des chiers d'initialisation sont automatiquement lancs. Ils initialisent l'environne ment de l'utilisateur. Ils donnent en particulier des valeurs initiales aux variable 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. Remarque 3.2 Si on travaille sous X Window, une variable importante est DISPLAY qui indiqu aux clients X (programmes qui utilisent le systme graphique X Window) avec qu terminal clavier-cran-souris ils doivent travailler. 3.2 Sortie du systme La commande exit permet de sortir d'un shell. S'il s'agit du shell de connexion, l session de travail se termine. 3.3 Touches spciales Quelques touches/caractres ont des signications spciales (Ctrl C s'obtient au clavie en maintenant appuye la touche Ctrl] du clavier tout en appuyant sur la touche C) : Ctrl S interrompt la transmission des caractres entre le terminal et le programme e cours Ctrl Q rtablit la transmission en librant tous les caractres taps depuis un prc dent Ctrl S Ctrl D est transmis comme une n de chier par le driver de terminal s'il est l'uniqu caractre d'une ligne (voir 8.1). Elle permet donc de terminer un shell la place de la commande exit, sauf l'utilisateur inhibe cette fonction pour viter des sorties involontaires en pla'an CHAPITRE 3. PREMIERS PAS DANS LE SYSTME 20 la commande interne set -o ignoreeof du shell dans un chier d'initialisation du shell (voir 15.3). Il est en eet facile de taper par erreur Ctrl] D au lieu, par exemple, de Shift] D. La touche Ctrl] D permet aussi d'eacer le caractre sur lequel se trouve le curseur quand on modie une ligne de commande. Ctrl C interrompt l'excution d'une commande Ctrl U eace la ligne de commande en cours d'criture Les quatre 0ches permettent de rappeler les commandes dj tapes et de se dplacer dans ces commandes pour les modier (tout caractre tap s'insre dans la commande). 3.4 Format des commandes Unix 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 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 commandes direntes, peuvent avoir des noms et des syntaxes direntes. Par exemple, pour dsigner un sparateur de champ, la commande sort utilise -d alors que la commande cut utilise -t. La syntaxe gnrale des commandes Unix est : commande options... arguments... Les arguments indiquent les objets sur lesquels la commande va agir et les options indiquent des variantes dans l'excution de la commande. 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. Les arguments peuvent tre absents et, dans ce cas, prennent des valeurs par dfaut. Exemples 3.1 (a) date (b) ls -la (c) ls -l /users/students (d) ls /users/students 3.5. CONSULTATION DU MANUEL EN LIGNE (MAN) 2 3.5 Consultation du manuel en ligne (man) La commande man permet de consulter le manuel de rfrence des commandes Unix man -s numro-section ] commande ache les pages du manuel de rfrence sur la commande et dans la section indique. Su certaines versions de man le numro de la section est donn seul, sans tre prcd d l'option -s. 1 est le numro de section par dfaut. Les direntes sections sont les suivantes (sur un Unix Solaris * on peut trouver de variantes sur les dirents Unix) : 1. commandes pour l'utilisateur (ls, sort, etc.), 2. appels systme (pour les programmeurs en langage C), 3. fonctions diverses de direntes librairies (pour les programmeurs en langage C), 4. information sur les formats de chiers (passwd, group, etc.), 5. informations diverses, 6. jeux et dmonstrations, Les informations pour l'administration du systme sont donnes dans la section 1M. Chaque section a une entre particulire intro qui la dcrit et donne quelques info mations gnrales. Exemples 3.3 (a) man man (b) man ls (c) man -s 2 intro (ou man 2 intro suivant les Unix) man -k mot-cl 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 la commande) du manuel. Dans les manuels de rfrence, ] indique les options ou les arguments facultatifs, arg... indique que l'argument arg peut tre rpt. Remarque 3.3 Pour que cette option fonctionne, l'administrateur doit eectuer une indexation pra lable des noms de commandes qui sont rpertories dans le manuel. Exemple 3.2 Exemple 3.4 ls -abcCdfFgilmnopqrRstux] files...] man -k directory CHAPITRE 3. PREMIERS PAS DANS LE SYSTME 22 3.6 Nom d'un chier, nom absolu, nom relatif Le nom terminal est compos d'au plus 14 caractres si l'on veut rester compatible avec toutes les versions d'Unix systme V (jusqu' 255 caractres dans toutes les versions rcentes d'Unix). Tous les caractres du code ASCII sont autoriss sauf / et le caractre de code 0. Le nom (ou chemin) absolu est compos du nom terminal prcd du chemin d'accs ce chier depuis la racine. Par exemple, /users/students/jean/ache Le premier / dsigne le rpertoire racine. Les / suivants servent de sparateurs entre les noms des rpertoires et le nom terminal. Ce nom absolu est souvent lourd manier car il peut tre trs long. Un chier peut tre dsign par son nom (ou chemin) relatif qui correspond la position du chier relativement au rpertoire courant o- se trouve le processus qui dsigne le chier (voir 2.2). Un nom est relatif quand il ne commence pas par un /. Exemple 3.5 Si l'utilisateur (plus prcisment le processus qui excute le shell courant de l'utilisateur) se trouve dans le rpertoire /users/students/jean, il pourra dsigner le chier de l'exemple ci-dessus par ache. S'il se trouve dans le rpertoire /users/students, il pourra dsigner ce chier par jean/ache. 3.7. COMMANDES 2 peuvent tre appeles par leur nom terminal. Il n'est pas ncessaire de taper leur nom absolu ou relatif. On peut par exemple taper 'man' au lieu de '/bin/man' parce que le rpertoire /bi fait partie de la liste de rpertoires de la variable PATH. On peut acher la valeur de PATH avec la commande (en gnral la liste est plu longue que la rponse donne ici * (~) est le prompt) : (~) echo $PATH /bin:/usr/bin:/users/students/toto/bin:/usr/ucb:. La valeur est une suite de noms de rpertoires spars par :. Le rpertoire courant peu tre indiqu par un ., ou par : au dbut ou la n de la liste. Pour des raisons de scurit, il n'est pas conseill de mettre le rpertoire courant a dbut de la liste. En eet, la liste est parcourue de gauche droite pour rechercher un commande et on n'est pas certain de ne pas avoir par exemple un chier ls pig dan le rpertoire courant, lorsque l'on se dplace dans l'arborescence et que l'on lance cett commande. Cette variable est initialise par l'administrateur du systme au moment de la cratio de l'utilisateur. L'utilisateur peut ensuite modier sa valeur. Le plus souvent cette valeu est donne dans le chier .zshenv si on travaille avec zsh (voir 15.3). 3.7 Commandes Remarque 3.4 La variable PATH n'est utilise pour rechercher une commande que si le nom de l commande ne comporte aucun /. Si vous tapez bin/cmd, la commande ne ser recherche que dans le rpertoire bin situ sous le rpertoire courant et pas sou 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 PATH. 3.7.1 Lancer une commande, supprimer un processus 3.7.3 Nom complet et type d'une commande (whence, whereis) . .. Noms relatifs particuliers : dsigne le rpertoire courant (o- l'on se trouve) dsigne le rpertoire parent du rpertoire courant Lorsqu'il a la main (le prompt est ach) l'utilisateur peut lancer une commande en tapant son nom suivi ventuellement de ses options et de ses arguments. La plupart des commandes peuvent s'interrompre en tapant sur la touche d'annulation. Cette touche est le plus souvent Ctrl] C ou la touche DEL]. Certaines commandes peuvent se protger contre une interruption par la touche d'annulation. Dans ce cas, on peut tout de mme les interrompre par la commande kill (voir 7.2). Un processus lanc en arrire-plan est automatiquement protg d'une interruption par la touche d'annulation et la seule fa'on de l'interrompre est d'utiliser la commande kill. 3.7.2 Nom d'une commande, variable PATH Pour faciliter le travail de l'utilisateur, les commandes qui sont situes dans la liste des rpertoires enregistre dans la variable PATH (attention, le nom est en majuscules) Comme on vient de le voir, la facilit oerte par la variable PATH provoque parfois de problmes. Sous ksh et zsh (mais pas sous sh ), la commande whence permet de savoir o se situera la commande excute : whence -vp] commande indique comment serait interprte la commande si elle tait tape : fonction, command interne du shell, alias ou chemin absolu pour un chier situ dans un des rpertoires de l variable PATH. -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 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 et Unix OSF d'une commande. Pour retrouver toutes les versions qui se trouvent de 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 commandes 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 -a -A -d -t -i -R -g format dtaill (voir 4.2) liste aussi les noms de chiers qui commencent par un . (qui ne sont pas no malement lists) comme l'option -a mais les rpertoires . et .. ne sont pas achs si l'argument est un rpertoire, liste seulement son nom (et pas les chiers qu sont sous ce rpertoire) trie par date de dernire modication (sinon la liste des chiers est trie pa dfaut par ordre alphabtique), les plus rcemment modis en premier ache au dbut de la ligne le numro de i-node des chiers listage rcursif des sous-rpertoires 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 $ ls -l / total 20954 lrwxrwxrwx drwxr-xr-x drwxr-xr-x lrwxrwxrwx drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxrwxrwt drwxr-xr-x drwxr-xr-x drwxr-xr-x -rwxr-xr-x ........ 1 6 15 1 2 4 10 25 3 4 22 20 1 root root root root root root root root root root root root root Fig. system system system system system system system system system system system system bin 7 6144 4608 7 512 512 2560 512 5120 512 512 512 9246472 Apr Jan Jan Apr Feb Sep Jun Dec Jan Jan Dec Apr Jun 26 18 18 26 3 19 23 7 18 13 19 26 23 1995 07:02 07:02 1995 1995 10:52 1995 10:15 08:45 1995 13:07 1995 1995 bin -> usr/bin dev etc lib -> usr/lib mnt net sbin students tmp users usr var vmunix 4.1 ) Format de sortie de la commande ls -lg -L si un chier est un lien symbolique, cette option indique que l'on veut des renseignements sur le chier point par le lien et pas sur le chier lui-mme (voir commande ln en 9.3) Exemples 4.1 (a) ls -l bin /usr/bin (b) ls -ld a* ache les informations sur les chiers du rpertoires courant (dont le nom commence pas par un a). L'option -d est indispensable pour ne pas entrer dans les sousrpertoires s'il y en a dont le nom commence par a. (c) ls -t f* | head -1 ache le nom du chier le plus rcemment modi parmi tous les chiers du rpertoire courant, dont le nom commence par un f. 4.2 Information dtaille sur les chiers (ls -l) 4.2.1 Format d'achage Un exemple de format d'achage de la commande ls -l applique un rpertoire est donn la gure 4.1. Une premire ligne donne le nombre de blocs de 1024 octets qu'occupent l'ensemble des chiers lists par la commande. Le format d'une ligne est dtaill dans la gure 4.2. 4.2. INFORMATION DTAILLE SUR LES FICHIERS (LS -L) taille du fichier nom du propriétaire autorisations drwxr-xr-x 15 root system nombre de liens type du fichier Fig. nom du groupe 2 nom du fichier 4608 Jan 19 07:02 etc date de dernière modification 4.2 ) Format de sortie d'une ligne de la commande ls -lg Remarques 4.1 (a) Les versions Unix OSF et Systme V de ls achent le nom du groupe du chie avec l'option -l. En Unix BSD, le groupe s'ache avec l'option -g. Si on veu rcuprer une information dans une des colonnes il est donc prfrable d'associe toujours l'option -g l'option -l. (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). 4.2.2 Types de chiers Le type du chier est ach l'aide du premier caractre de la ligne de description d chier : chier ordinaire d rpertoire (directory) b chier spcial de type bloc (essentiellement les disques) c chier spcial de type caractre (disque, streamer, terminal, etc.) l lien symbolique s socket Pour les liens symboliques, le nom du chier point est donn la suite des autre renseignements sur le chier : 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 anglais) et le mineur dsigne le priphrique particulier gr par ce pilote : crw-rw-rw1 root 39,6 Feb 25 20:09 tty01 4.2.3 Mode d'acc s au chier Les autorisations (on dit aussi le mode d'accs au chier) du chier sont indique 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 CHAPITRE 4. COMMANDES LIES L'ARBORESCENCE DES FICHIERS 30 chier et les trois derniers sont les autorisations des autres (qui ne sont pas le propritaire et qui n'appartiennent pas au groupe). 4.2.4 Nombre de liens Pour les chiers ordinaires il s'agit du nombre de chiers ayant le mme numro de i-node. Pour les rpertoires, il indique le nombre de sous-rpertoires du rpertoire (augment de 2, car . et .. sont compts). 4.3 Se dplacer dans l'arborescence (cd) cd rpertoire] dplace le processus dans rpertoire (rpertoire HOME par dfaut). Exemple 4.2 cd /users/students/jean Une facilit oerte par zsh est bien utile quand on a besoin de travailler entre deux rpertoires : cd - permet de se dplacer dans le rpertoire o- l'on tait avant le dernier dplacement. 4.4 Acher le rpertoire courant (pwd) pwd Il est souvent plus prudent de taper cette commande avant d'eectuer une commande dangereuse (suppression de chiers par exemple) pour savoir o- l'on est plac dans l'arborescence. 4.5 Caractres spciaux pour le shell 4.5.1 Gnration des noms de chiers (*,?, ) Les caractres * ? ] sont interprts par le shell quand ils gurent dans une commande. Cette interprtation s'appelle la gnration des noms de chiers. Le shell interprte chaque mot qui les contient comme un modle de noms de chiers : il remplace le mot par une liste alphabtique des noms des chiers qui correspondent ce modle. Si aucun chier ne correspond au modle, le modle est laiss tel quel par sh et ksh. Pour zsh, c'est le cas si l'option NO_NOMATCH est positionne (voir 14.1.2), sinon, zsh interrompt l'interprtation de la commande et ne lance pas son excution. * dsigne zro, un ou plusieurs caractres, 4.5. CARACTRES SPCIAUX POUR LE SHELL 3 ? dsigne un caractre quelconque, c1 -c2] ou c1 c2...] dsigne un caractre spci par l'intrieur des crochets. Par exemple, a-z dsigne une lettre minuscule et AEIOUY] dsigne une voyelle majuscule. On peut aussi dsigner un caractre quelconque qui n'est pas parmi les caractre spcis entre les crochet en faisant suivre le crochet ouvrant du caractre ^ Par exemple, sous zsh, ^0-9] dsigne un caractre qui n'est pas un chir Attention, sous sh et ksh, il faut crire !0-9] 1 . n supprime la signication spciale du caractre suivant. Exemple 4.3 Si l'utilisateur tape la commande ls -l bin/A0-9]* la commande suivante sera lance aprs l'interprtation du shell : ls -l bin/A1abc bin/A2xy si les 2 chiers A1abc et A2xy sont les deux seuls chiers du rpertoire bin qu commencent par un A suivi d'un chire. Remarque 4.2 Attention, * ne peut dsigner une cha ne de caractres qui comprend un / o une cha ne de caractres qui commence par un . si ce . est plac en tte ou just derrire un /. Ces deux exceptions sont aussi valables pour les caractres spciau ? et ]. 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 courant qui se terminent par la lettre c (y compris ceux qui commencent par un . il faut taper ls -d .*c *c 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 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.2 Le caract re spcial Pour ksh et zsh (mais pas pour sh ), le caractre ~ (seul ou plac en tte de mot) une signication particulire : dsigne le rpertoire HOME de l'utilisateur, utilisateur dsigne le rpertoire HOME de l'utilisateur indiqu. 1. Il faut se souvenir (voir 14.11.1) que, sous zsh et sans indication particulire, un shellscript est ex cu par sh et il faut donc utiliser cette syntaxe dans les shellscripts 32 CHAPITRE 4. COMMANDES LIES L'ARBORESCENCE DES FICHIERS Exemples 4.4 (a) cp ~/fich (b) ~/bin ls -l ~toto/bin/fich 4.5.3 Le caract re spcial # Dans les shellscripts, le shell considre que tout mot qui commence par un # est le dbut d'un commentaire qui va jusqu' la n de la ligne. Si un mot commence par un # et n'introduit pas un commentaire, il faut donc le faire prcder de n. Un # l'intrieur d'un mot n'est pas considr comme un caractre spcial. Remarques 4.3 (a) En mode interactif (c'est--dire lorsque la commande est tape directement au clavier par l'utilisateur), zsh (mais pas ksh ) ne considre pas # comme un caractre spcial. (b) Voir le cas particulier d'un chier excutable dont la premire ligne commence par #! en 14.11.1. 4.5.4 Autres caract res spciaux Sous zsh, ! et la tabulation sont des caractres particuliers. ! est li l'historique des commandes. Si on veut l'utiliser dans un autre sens, il faut le faire prcder de \. Ce caractre tant li l'historique des commandes n'a d'utilit qu'en interactif. zsh ne le considre donc pas comme un caractre spcial dans un shellscript. La tabulation permet la compltion de commande. Si on veut insrer une tabulation dans une commande, on la fait prcder de Ctrl V. 4.6 Acher le type d'un chier (le) file fichiers... tente de deviner le type de chier (rpertoire, excutable binaire, shellscript, ASCII, langage, etc.). 4.7 Rechercher des chiers dans l'arborescence (nd, locate) find rpertoires... -name modle-nom -print ache les noms des chiers dont les noms correspondent modle-nom et situs dans l'arborescence des rpertoires. modle-nom peut comporter des caractres spciaux semblables aux caractres spciaux utiliss dans la gnration des noms de chiers par le shell (voir 4.5). Plus exactement, nd 4.7. RECHERCHER DES FICHIERS DANS L'ARBORESCENCE (FIND, LOCATE)3 reconnait les caractres *, ?, ] (attention, la ngation des caractres entre crochets es donne par un ! et pas par un ^). Un . n'est reconnu en dbut de nom que s'il est donn explicitement. Exemple 4.5 find /usr -name "info*" -print recherche tous les chiers situs sous /usr dont le nom commence par info. On do entourer info* avec des guillemets pour viter le remplacement (par le shell) de * pa des noms de chiers (voir 14.8). La commande nd a de nombreuses autres options qui permettent de rechercher le chiers qui vrient certains critres. En voici quelques unes : -size n taille en nombre de blocs de 512 octets -mtime n nombre de jours depuis la dernire modication -atime n nombre de jours depuis le dernier accs Dans les options ci-dessus, n peut tre remplac par +n (nombre suprieur n) ou pa -n (nombre infrieur n). -user nom propritaire -type t type du chier (un f pour un chier ordinaire et les autres abrviation comme dans la commande ls -l * voir 4.2) -perm nb_octal est vrai si le chier a les autorisations nb_octal -perm -nb_octal est vrai si le chier a au moins les autorisations nb_octal Les deux options -exec et -ok permettent d'excuter une commande sur les chier qui vrient 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 conrmation de l'utilisateu 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. -exec commande n -ok commande n 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 sition des options. Les options sont examines (et excutes pour -print, -exec et -ok) tant que la cond 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. Exemples 4.6 (a) find ~ -mtime -10 -print ache les noms des chiers de l'arborescence du rpertoire HOME de l'utilisateu qui ont t modis dans les dix derniers jours. 34 (b) (c) (d) (e) (f) CHAPITRE 4. COMMANDES LIES L'ARBORESCENCE DES FICHIERS 3 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 modis dans les 10 derniers jours. find ~toto ! -user toto -exec ls -ld {} \# ache des renseignements dtaills sur les chiers qui n'appartiennent pas toto dans son rpertoire HOME. 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. Chapitre 5 Protection des chiers find ~ -name core -ok rm {} \# supprime (aprs conrmation par l'utilisateur) tous les chiers core situs sous le rpertoire HOME. Les chiers core sont cres automatiquement quand certains programmes s'interrompent par suite d'une erreur. Ils peuvent servir aux experts pour trouver la cause de l'erreur. find . \( -name "*.java" -o -name "*.html" \) -exec more {} \# ache page page tous les chiers "*.java" et "*.html" de l'arborescence du rpertoire courant. locate modle-de-nom... recherche les chiers dont le nom correspond modle-de-nom. Si modle-de-nom contient des jokers (*,? ou ]), locate donne tous les chiers dont le nom contient modle-de-nom. Sinon elle donne les chiers dont le nom correspond au modle. Cette commande GNU n'est pas toujours installe sur les systmes Unix. Si l'administrateur l'a installe, elle permet de grer une base de donnes des chiers disponibles. Dans ce cas, cette commande est normment plus rapide que la commande nd et charge beaucoup moins le systme. 5.1 Changement des autorisations (chmod) chmod -R] mode-accs fichiers... donne des autorisations aux chiers. Seuls le propritaire du chier et le super utilisateu peuvent utiliser chmod. mode-accs indique quelles sont les autorisations que l'on donne * on peut donner ce autorisations sous forme absolue ou symbolique. L'option -R (rcursif) indique que, si un des chiers est un rpertoire, chmod do changer les autorisations de toute l'arborescence du rpertoire. Mode d'accs absolu Les autorisations sont donnes par mode-accs sous forme d'un nombre octal compos de 3 chires. Le premier chire correspond aux autorisations que l'on donne au propritaire de chiers, le deuxime correspond au groupe des chiers et le troisime correspond tous le autres utilisateurs. 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) CHAPITRE 5. PROTECTION DES FICHIERS 36 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 5.2 Masque pour les autorisations (umask) 3 Chapitre 6 Commandes d'observation du systme umask nnn] donne la valeur octale nnn (cf. mode absolu de chmod en 5.1) au masque qui sera utilis pour limiter les autorisations que recevront les nouveaux chiers au moment de leur cration. Exemple 5.2 umask 026 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). umask (seul) ache le masque en cours. Celui-ci est en gnral 022 si l'utilisateur n'a pas lanc de 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 autorisations rwxr-xr-x. 6.1 Date et Heure (date) date ache la date et l'heure. Des formats d'achage sont disponibles en option. 6.2 Nom de l'ordinateur (hostname) hostname ache le nom de l'ordinateur sur lequel la commande s'excute (taloa.unice.fr, par exemp 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. CHAPITRE 6. COMMANDES D'OBSERVATION DU SYSTME 38 finger @machines...] 6.7. ESPACE DISQUE OCCUP 3 ypcat -k network ache les informations de la commande who et des informations informelles sur les utilisateurs (leur nom et prnoms, leur tlphone,. . . ) actuellement connects sur les machines (la machine locale par dfaut). ache l'ensemble des netgroups (voir cours sur les rseaux). L'option -k permet d'avo les noms des groupes et pas seulement les noms des membres. ache les informations sur les utilisateurs spcis, 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 des utilisateurs sont achs. Pour utilisateur on peut donner le nom de login ou le nom rel ach par la commande. 6.7 Espace disque occup finger utilisateur@machine]... rusers devrait donner une liste des utilisateurs connects sur le rseau (mais 'a ne marche pas toujours...). 6.5 Dernires connexions au systme (last) Il est prudent de vrier rgulirement que personne n'est entr sous son propre nom. last -n] utilisateur] terminal] ache des informations sur les dernires connexions. On peut se limiter aux connexions d'un utilisateur ou aux connexions tablies partir d'un certain terminal. On peut aussi se limiter aux n dernires connexions. Exemple 6.1 last -3 toto ache les trois dernires connexions (y compris l'actuelle) de toto. Remarque 6.1 last ne donne pas toujours les connexions partir des terminaux X ou des stations de travail. Cela dpend du systme de gestion des connexions de X Window et des chiers de conguration installs par l'administrateur systme. 6.6 Systme Network Information Service (NIS) Le systme NIS (anciennement appel Yellow Pages) permet de concentrer sur une seule machine la gestion de certains chiers utiliss pour l'administration du systme Unix. Il permet en particulier de grer les chiers qui contiennent les informations sur les 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). ypcat hosts ache l'ensemble des noms et des numros IP des machines du rseau local. ypwhich -x ache les noms possibles pour les dirents types de chiers que le systme NIS peut gre 6.7.1 Place occupe par la branche d'un rpertoire (du) du options...] fichiers...] ache le nombre de blocs occups par les chiers indiqus (rpertoire en cours par dfaut 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. 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. -s ache seulement le nombre total de blocs -a ache la taille de tous les chiers et rpertoires Exemple 6.2 du -s $HOME 6.7.2 Place libre d'un syst me de chiers (df) df systme-fichiers] fichier] ache le nombre de blocs de 512 octets disponibles pour le systme de chiers spci Le systme de chiers peut tre spci par le nom du priphrique (/dev/. . . ) ou par u chier quelconque du systme mont. df (sans argument) ache les renseignements sur tous les systmes monts (voir 1.6.1 Exemples 6.3 (a) df /dev/rz3a 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). (b) df . ache les renseignements sur le systme de chiers sur lequel se trouve le rpertoir courant. 6.8 Nom du terminal utilis (tty) tty 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 spcie, 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 CHAPITRE 7. COMMANDES POUR LA GESTION DES PROCESSUS 42 en OSF : ps -Al ww en Systme V : ps -Afl 7.2 Supprimer un processus en cours d'excution (kill) On peut supprimer un processus lanc en avant-plan en tapant la touche d'annulation (le plus souvent Ctrl-C) dans la fentre dans laquelle ce processus a t lanc. Pour les processus lancs en arrire-plan (voir 14.5), cette touche d'annulation n'a aucun eet. Pour les supprimer il faut utiliser la commande kill. kill -signal] pid envoie le signal indiqu au processus dont pid est le numro de processus. signal est un numro de signal compris entre 0 et 15 (15 par dfaut) ou le symbole d'un signal : HUP (1), INT (2), QUIT (3), KILL (9), TERM (15), etc... (taper kill -l pour avoir la liste complte des noms des signaux.) Exemples 7.2 (a) kill 128 (b) kill -9 128 (c) kill %2 (d) tue le processus lanc en arrire-plan qui a le numro 2 pour le shell dans lequel la commande kill a t tape. kill -9 -1 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. Les super-utilisateurs peuvent tuer tous les processus. L'utilisateur normal ne peut tuer que ses propres processus. 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. 7.3. LANCEMENT AUTOMATIQUE DE PROCESSUS DES MOMENTS DONNS ( 7.3 Lancement automatique de processus des moment donns (at, crontab) Si l'administrateur du systme l'a autoris (voir le manuel en ligne des commandes a et crontab ), les utilisateurs peuvent programmer le lancement automatique de processu mme lorsqu'il ne sont pas connects. at sert lancer une commande un moment donn. crontab est plus spcialemen utilis pour lancer des commandes intervalles rguliers (chaque jour par exemple). Sans entrer dans les dtails, voici des exemples standards : at -f ~/fichier 3:00 at -l am January 24 lance les commandes contenues dans ~/fichier (indiquez toujours un nom absolu) 3 heures du matin le 24 janvier. ache les commandes programmes. crontab fichier-cron programme ce qui est indiqu dans le chier fichier-cron. Voici un exemple de conten d'un tel chier (voir le manuel en ligne pour plus d'explications) : # # # 0 Lance 'dumptout -f' tous les jours (sauf le lundi) ' 2h du matin (0 minutes), tous les jours du mois, tous les mois, le dimanche (0) et du mardi au vendredi (2-6) 2 * * 0,2-6 /usr/adm/dumptout -f crontab -l ache les commandes programmes. crontab -e permet de modier les commandes programmes. 7.4 Gestion du plan d'un processus par le shell La plupart des shells (mais pas sh ) permettent de grer le plan o- se droule les pro cessus (en arrire-plan ou non). Cette gestion est tudie en 14.5.1. 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 nouveaufichier cre Chapitre 8 Acher, imprimer, envoyer le contenu d'un chier 8.1 Acher le contenu d'un chier, concatner plusieurs chiers (cat) - Notion de redirection cat -nsv] fichiers...] ache le contenu des chiers. Si aucun chier n'est spci, l'entre standard est prise par dfaut. -n -s -v Options numrote les lignes runit plusieurs lignes vides en une seule ligne ache les caractres non visibles Exemples 8.1 (a) cat /etc/passwd (b) cat ache (plus exactement, envoie sur la sortie standard) les lignes qui sont tapes au clavier. On termine en tapant Ctrl D qui est transform en annonce de n de chier par le driver de terminal. C'est surtout utile avec une redirection (voir ci-dessous). Le nom de la commande vient de concatner car cat fich1 fich2 >fich3 concatne ch1 et ch2 dans ch3. > est un symbole de redirection (la sortie standard 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) : $ cat >nouveaufichier ligne1 avec deux lignes de texte. 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 emacs possde aussi le mode de travail Hexl qui permet de voir, et mme de modie les octets d'un chier. On tape M-x hexl-nd-le pour charger le chier binaire. On peu 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 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 : h ache la liste des commandes disponibles Retour] ache une ligne de plus espace] ache l'cran suivant iespace] ache i lignes de plus Ctrl B revient la page prcdente (ne marche pas si le 0ot de donne ne vient pa d'un chier ordinaire) q ou Q sort de more = ache le numro de la ligne en cours /texte recherche un texte : ache un nouvel cran qui commence 2 lignes avant l 1re ligne qui contient texte n refait la dernire recherche :n va au chier suivant :f ache le nom du chier et le numro de la ligne Gr&ce un pipe (notion tudie en 14.3) la commande more peut recevoir sur so 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 exemple : ls -l /bin | more 8.4 Sorties sur les imprimantes Lorsque l'utilisateur lance l'impression d'un chier, le contenu de ce chier est envoy 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 duction du terme anglais spool qui est d'ailleurs le plus souvent utilis) le slectionnera. Ce systme de spool permet de redonner la main tout de suite l'utilisateur sans attendre la n de l'impression du contenu du chier. Il existe deux systmes d'impression : lp (Unix Systme V) et lpr (Unix BSD). Le 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, en particulier sur les noms des imprimantes. Les systmes Unix actuels disposent des deux systmes d'impression et des passerelles sont souvent installes par l'administrateur pour 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.1 Informations sur le syst me d'impression (lpstat, printcap) En Unix BSD, le chier /etc/printcap contient les noms et descriptifs des imprimantes du systme. Sous Unix Systme V et OSF, la commande lpstat permet d'avoir des informations sur le systme d'impression. lpstat options ] -d -p -r -s -t -v Options donne l'imprimante par dfaut statut des imprimantes et de la gestion des les d'attente associes tat du dmon d'impression un rsum des prcedentes options tout ce que vous avez toujours voulu savoir sur le systme d'impression noms des imprimantes et des noms de chiers spciaux ou de machines distantes associes Exemple 8.2 Certaines de ces options peuvent tre suivies de listes d'imprimantes, d'utilisateurs ou d'identicateurs de requtes d'impression. lpstat -p lp17,lp30 8.4.2 Lancement d'une requte d'impression (lpr) lpr options] fichiers...] place une liste de chiers dans la le d'attente d'une imprimante. Un saut de page est envoy aprs chaque chier. Si la liste de chiers est vide, c'est l'entre standard qui est place en le d'attente (ce qui permet d'utiliser lpr la n d'un pipe). Dans tout systme, l'administrateur donne une imprimante par dfaut vers laquelle les requtes sont diriges (imprimante de nom lp). La variable PRINTER peut contenir le nom d'une autre imprimante. On peut aussi utiliser l'option -P. Les options sont nombreuses et peuvent varier suivant la version du systme. 8.4. SORTIES SUR LES IMPRIMANTES 4 Options -Pimprimante dirige l'impression vers l'imprimante spcie -h supprime la bannire d'impression (premire page o- sont imprims le nom de l'utilisateur qui a lanc l'impression et diverses autres informations) Exemples 8.3 (a) lpr -h -Plp3 fichier (b) ls -l | lpr -h 8.4.3 Informations sur les requtes d'impression (lpq) lpq -Pimprimante] utilisateur] ache des renseignements (utilisateur, position dans la le d'attente, nom du chier imprimer, identicateur de la requte, taille de ce qui sera imprim) sur les requtes d'im pressions actuellement en attente d'tre imprimes. Options -Pimprimante limitent les informations aux requtes envoyes sur l'imprimante utilisateur limitent les informations aux requtes lances par utilisateur. Exemple 8.4 lpq -Plp3 jean donne les informations sur les requtes envoyes par jean sur l'imprimante lp3. 8.4.4 Suppressions de requtes d'impression (lprm, cancel) lprm -Pimprimante] -] identificateur-requte] permet un utilisateur de supprimer une requte d'impression qu'il avait prcdemmen lance (si l'impression est dj commence, elle est interrompue). On ne peut supprime les requtes d'un autre utilisateur (sauf si l'on est le super-utilisateur). Si aucune optio n'est spcie, 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 -Pimprimante supprime toutes les requtes que l'utilisateur a lances sur imprimante supprime toutes les requtes que l'utilisateur a lances identicateur-requte supprime la requte dnie par son identicateur (on peut faire ache l'identicateur par la commande lpq tudie en 8.4.3). Exemples 8.5 (a) lprm -Plp1 (b) lprm - 26 48CHAPITRE 8. AFFICHER, IMPRIMER, ENVOYER LE CONTENU D'UN FICHIER 8.7. PASSER EN POSTSCRIPT (A2PS) Si la commande lprm semble ne pas fonctionner, on peut essayer la commande cancel. Par exemple, pour supprimer les requtes que l'utilisateur toto a envoyes sur l'imprimante lp0, on tapera : De plus, les noms des options peuvent changer avec les versions de a2ps. Heureusemen l'une des options que l'on retrouve dans toutes les versions est l'option -h qui donne un liste des options disponibles. 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. 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 si on veut le mode de positionnement portrait ou paysage (sur la largeur de la pag landscape en anglais), etc. Il existe de trs nombreuses options, souvent trs utiles que l'o aura intrt lire dans le manuel en ligne. Exemple 8.7 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 deux pages par feuille en mode paysage : cancel -u toto lp0 8.5 Envoyer le contenu d'un chier (mail) Le plus simple pour envoyer par courrier lectronique un chier est d'utiliser la commande mail avec une redirection de l'entre standard (voir 14.2.4) : mail adresse <fichier 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 auparavant par uuencode (voir cours sur les rseaux). Exemple 8.6 mail -s "Fichier fich" [email protected] < rep/fich L'option -s permet de donner un sujet au message * elle n'est pas disponible sur toutes les versions de la commande. 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. a2ps truc.java | lpr Pour imprimer une page par feuille en mode portrait : a2ps -P -1 truc.java | lpr 4 CHAPITRE 9. GESTION DES FICHIERS 50 9.2. LIENS AVEC MME NUMRO DE I-NODE (LN) 5 9.2 Liens avec mme numro de i-node (ln) Chapitre 9 Gestion des chiers Ce chapitre traite des commandes qui travaillent sur des chiers ordinaires en les considrant comme un tout, sans faire d'oprations sur le contenu des chiers. 9.1 Copier des chiers (cp) cp -ip] fichier1 fichier2 copie le chier ordinaire chier1 sur le chier ordinaire chier2. L'utilisateur doit avoir l'autorisation de lecture sur le chier chier1. Si chier2 existe, l'utilisateur doit avoir l'autorisation d'criture dans ce chier. Dans ce cas, le contenu de chier2 est cras par celui de chier1. chier2 garde son propritaire, son groupe et ses autorisations. Si chier2 n'existe pas, l'utilisateur doit avoir l'autorisation d'criture sur le rpertoire de chier2. Dans ce cas, chier2 est cr et son propritaire et son groupe sont ceux de l'utilisateur et les autorisations sont celles de chier1 (mais tient compte de la valeur du masque de umask * voir 5.2). -i -p Options fait acher un message de demande de conrmation si chier2 existe dj conserve les dates de modication et d'accs, le propritaire et le groupe, le mode d'accs de chier1 pour chier2 (ne tient pas compte du masque pour le mode d'accs * voir 5.2) cp -ip] fichiers... rpertoire copie les chiers dans le rpertoire. Exemples 9.1 (a) cp fich* jean/courrier (b) cp fichier1 fichier2 jean Remarque 9.1 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). 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 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 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 un mme systme de 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 rpertoire courant de mme nom terminal que chier1. L'option -f permet d'craser chier2 s'il existe dj. ln -f] fichiers... rpertoire cre des liens entre les chiers et les chiers situs sous le rpertoire et de mme nom terminal que les chiers. Les chiers doivent appartenir un mme systme de chiers qu le rpertoire. Les chiers ne peuvent tre des rpertoires. Remarques 9.2 (a) Quand un lien a t cr entre deux chiers, les deux chiers jouent ensuite un r symtrique et il n'y a pas lieu de distinguer un chier originel parmi tous ces chier (b) Tous les chiers lis ont le mme i-node. Ceci implique que lorsque l'on modie contenu ou les autorisations d'un chier, tous les chiers qui lui sont lis sont modi de mme. Le propritaire, le groupe et les dates de dernire modication et de cratio sont les mmes pour tous les chiers lis correspondant un mme chier physique (c) La commande ls ainsi lis. -l renverra un nombre de liens suprieur 1 pour les chier (d) Si on supprime un des deux chiers par la commande rm, l'autre continuera existe avec un nombre de lien ach par ls -l diminu de 1. Exemples 9.2 (a) ln rep1/fichier (b) rep2 ln rep1/fichier rep2/fichier2 CHAPITRE 9. GESTION DES FICHIERS 52 9.3 Liens symboliques (ln -s) Les liens tudis dans la section prcdente ont quelques limitations. En particulier, les deux chiers lis doivent tre placs dans un mme systme de chiers et les chiers auxquels on ajoute un lien (ceux que l'on rfrence) ne peuvent tre des rpertoires. Les liens symboliques orent plus de souplesse. Un lien symbolique est un chier de type spcial qui contient le nom d'un autre chier auquel il est li. Toutes les commandes usuelles qui contiendront le nom du lien symbolique, travailleront en fait avec le chier dont le nom est contenu dans le lien symbolique. ln -s fichier1 fichier2] cre un lien symbolique chier2 qui se rfrera chier1. chier1 et chier2 peuvent tre des rpertoires et ils peuvent appartenir deux systmes de chiers dirents. chier1 peut mme tre supprim ensuite (et dans ce cas, toute rfrence chier2 provoquera une erreur) ! chier1 peut tre un rpertoire. 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 mv ) : ln -s fichiers... rpertoire Exemple 9.3 ln -s /usr/new/emacs/emacs bin cre un lien symbolique bin/emacs qui pointe sur /usr/new/emacs/emacs. Remarques 9.3 (a) ls -l fichier d'un chier (ou rpertoire) qui est un lien symbolique, ache le 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 (b) les autorisations sur un lien symbolique n'ont aucune signication : les droits rels sont ceux du chier point. (c) on fera attention de donner un nom absolu pour chier1, ou un nom relatif par rapport au rpertoire de chier2 pour que le chier point soit retrouv lorsque le systme utilisera le lien symbolique. 9.4 Supprimer des chiers (rm) rm options...] fichiers... enlve le chier de son rpertoire. 9.5. DPLACER, RENOMMER DES FICHIERS (MV) 5 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 d'criture sur le chier, une conrmation est demande). -f Options -r -i pas de demande de conrmation quand on n'a pas l'autorisation d'criture sur chier, renvoie un code retour 0 (tout s'est bien pass) mme si un des chier n'existe pas dtruit tout le contenu d'un rpertoire et le rpertoire lui-mme demande de conrmation pour chaque chier (ou rpertoire avec l'option -r) Exemple 9.4 rm -fr l* Attention ne pas glisser par mgarde un espace entre le l et le *. On se mer aussi des claviers dont la touche l ne fonctionne pas bien ! Il est prudent de lire su l'cran la commande tape avant de la lancer. 9.5 Dplacer, renommer des chiers (mv) mv fich1 fich2 renomme ch1 en ch2. Le chier peut changer de rpertoire cette occasion. mv fichiers... rpertoire les chiers passent sous rpertoire. Ils gardent le mme nom terminal. Exemples 9.5 (a) mv fichier1 rep/fichier2 (b) mv jean/fich1 jean/fich2 pierre 9.6 Sauvegarder sur les lecteurs de disquettes des sta tions Sun 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 recopier sur des disquettes des programmes rcuprs sur le rseau Internet ou leurs chier de travail pour les emmener sur leur PC personnel. 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. 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 rpertoire contenant la commande mcopy). De plus, la commande eject permet d'jecte 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 sousrpertoires) on pourra utiliser la commande tar (voir 10.6). Consultez les manuels en ligne de ces commandes pour plus de prcisions. Chapitre 10 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 CHAPITRE 10. TRAVAIL SUR LES RPERTOIRES 56 Autoris seulement si les 2 rpertoires ont le mme parent en Unix Systme V. Unix BSD l'autorise si les deux rpertoires sont dans le mme systme de chiers. Exemple 10.1 mv /users/students/jean /users/students/jp 10.4 Copier l'arborescence d'un rpertoire (cp -r) cp -r rpertoire1 rpertoire2 copie toute l'arborescence de rpertoire1 sous rpertoire2. L'endroit o- seront copis les chiers dpend de l'existence du rpertoire rpertoire2. Si celui-ci n'existe pas, il sera cr et il correspondra rpertoire1. Sinon, les nouveaux chiers se retrouveront sous le rpertoire situ dans le rpertoire rpertoire2 et de mme nom terminal que le nom terminal de rpertoire1. Exemples 10.2 (a) cp -r ~toto/rep . cre (s'il n'existe pas dj) un rpertoire rep sous le rpertoire courant et copie les chiers de l'utilisateur toto sous ce rpertoire (b) cp -r ~toto/rep/. . copie les chiers de rep directement sous le rpertoire courant Remarque 10.1 La commande suivante copie les chiers placs directement sous un rpertoire rep1 dans un rpertoire rep2. cp rep1/* rep1/.* rep2 Les sous-rpertoires ne seront pas copis et engendreront des messages d'erreurs. 10.5 Lien symbolique (ln -s) Un lien symbolique peut pointer un rpertoire. Ceci permet d'obtenir une conguration 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 modier les chiers de conguration 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 chercher 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 : 10.6. PLIAGE DE RPERTOIRES EN UNE SEUL FICHIER (TAR, CPIO) 5 ln -s /usr/local2/rep1 /usr/local/rep1 Si le rpertoire /usr/local/rep1 existe dj, on crera des liens symboliques sou le rpertoire /usr/local/rep1 pour tous les chiers de /usr/local2/rep1 qui son concerns * par exemple, pour fichier1 : ln -s /usr/local2/rep1/fichier1 /usr/local/rep1 10.6 Pliage de rpertoires en une seul chier (tar, cpio La commande tar peut plier un rpertoire en un seul chier. Tous les chiers d rpertoire sont alors runis en ce chier. Le transfert des chiers sur le rseau et leu archivage en est facilit, surtout si on compacte le chier rsultat. Cette commande possde de nombreuses options. On ne donne ici que les options prin cipales sur des exemples simples. tar cvf fichier.tar rep cre le chier fichier.tar qui contiendra tous les chiers des chiers indiqus. Si u chier indiqu est un rpertoire (comme ici rep), toute l'arborescence du rpertoire es 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 rcuprer les chiers (par tar x) un autre endroit. tar tvf fichier.tar liste les noms des chiers plis dans le chier fichier.tar. tar xvf fichier.tar rcupre tous les chiers plis dans fichier.tar. tar xvf fichier.tar f1 f2 rcupre tous les chiers plis dans chier.tar qui ont pour nom f1 ou f2. La commande cpio permet aussi l'archivage de chiers. Elle ne sera pas tudie ici. 58 CHAPITRE 11. EXPRESSIONS RGULIRES 11.2. EXPRESSIONS RGULIRES REPRSENTANT UN ENSEMBLE DE CARACT chane] Chapitre 11 Expressions rgulires Ces expressions sont utilises par plusieurs commandes * en particulier par more, emacs, grep, ed, sed, awk, perl 1 . Ce sont des cha nes de caractres qui reprsentent des modles pour des cha nes de caractres. Certains caractres ont des signications particulires. 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 d'expressions rgulires qui sont prsentes dans ce chapitre. Il existe d'autres types d'expressions rgulires. Pour conna tre exactement les expressions reconnues par une commande, il faut se rfrer au manuel de rfrence, ou faire des tests... De plus, les direntes versions d'une commande (par exemple la commande grep) ne reconnaissent pas le mme 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 interprts par le shell (voir 4.5) et qui sont donc reconnues dans toutes les lignes de commandes. 11.1 Expressions rgulires reprsentant un seul caractre Un caractre ordinaire se dsigne par lui-mme. Les expressions rgulires peuvent aussi contenir des caractres spciaux. Les expressions rgulires suivantes dsignent un seul caractre * elles sont reconnues par toutes les commandes : n suivi d'un autre caractre dsigne ce caractre. Il permet d'enlever le sens spcial des caractres comme ., *, et \. ! plac en dbut d'expression, dsigne un dbut de ligne. $ plac en n d'expression, dsigne une n de ligne. . (le point) dsigne n'importe quel caractre except le passage la ligne (quivalent de ? du langage de commande). 1. cette commande n'est pas tudi e dans ce cours 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. Exemples 11.1 (a) ^ab dsigne la cha ne ab place en dbut de ligne. (b) 0-9] (c) adh-lA-Z] (d) ^0-9] (e) ^\. (f) -d] dsigne un chire quelconque. dsigne a ou d ou une lettre minuscule comprise entre h et l, ou une lettre majuscule dsigne n'importe quel caractre qui n'est pas un chire. dsigne une ligne qui commence par un point. dsigne un - ou un d. 11.2 Expressions rgulires reprsentant un ensemble d caractres d'un seul type 4 partir des expressions rgulires correspondant un seul caractre (et seulement partir de ces expressions), on peut construire les expressions rgulires suivantes : * 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 dsigne la plus longue cha ne partir de la gauche qui permette de trouver un cha ne correspondant l'expression rgulire. La signication de * dire don de la signication habituelle lors de l'interprtation des commandes par le shel + et ? certaines commandes, (mais pas toutes les versions de grep) donnent un sen particulier aux caractres + et ? : ? dsigne 0 ou 1 occurrence des caractres dsigns par l'expression qui prcde + dsigne 1 ou plusieurs occurrences des caractres dsigns par l'expression qu prcde. Pour les commandes qui ne reconnaissent pas le +, on peut le simuler * pa exemple, xx* peut remplacer x+. CHAPITRE 11. EXPRESSIONS RGULIRES 60 n{ et n} certaines commandes (mais pas toutes les versions de grep) permettent de don- ner encore plus de prcision sur le nombre d'occurrences : on peut faire suivre une expression rgulire par (m et n sont des entiers compris entre 0 et 256) : n{mn} pour indiquer exactement m occurrences n{m,n} pour indiquer au moins m occurences 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). 11.3. AUTRES EXPRESSIONS RGULIRES 6 Des possibilits supplmentaires sont utilises par certaines commandes et en particulie par la commande awk (mais gnralement pas par ed ou grep) : expression1jexpression2 (...) dsigne une cha ne correspondant la 1ere ou la 2eme expression. les parenthses permettent de modier l'ordre de priorit des oprateurs. L'ordr de priorit est et ], puis *, + et ?, puis la concatnation et enn |. 62 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) Chapitre 12 diteur de texte (emacs, xemacs) Pour crire des textes (programmes ou donnes) sous Unix, il faut disposer d'un programme qui permette d'entrer du texte et de le modier sans tre oblig de tout retaper. Les programmes qui font ce genre de travail s'appellent des diteurs de textes. Ils possdent de nombreuses commandes qui facilitent la t&che de l'utilisateur : recherche de cha nes de caractres dans un texte, remplacement automatique de cha nes par une autre, copie, suppression 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 et moins souple. Une caractristique essentielle de emacs est qu'il est possible (et pas trop complexe) de personnaliser son fonctionnement en aectant des valeurs des variables d'environnement ou mme en programmant des nouvelles fonctionnalits. Nous ne donnerons ici que les commandes essentielles de emacs, susantes pour commencer 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 nombreuses facilits pour travailler avec des langues non europennes et pour congurer plus simplement emacs. xemacs est une version d'emacs plus graphique mais moins standard. Il possde beaucoup 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 l'universit de Nice. 12.1 Entre et sortie 12.1.1 Lancer emacs emacs -q] fichier] & 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 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 .zshrc (voir 15.3.2) : export EMACSDIR=/usr/local/emacs-19.31 export EMACSLOADPATH=$HOME/emacs:$EMACSDIR/site-lisp:$EMACSDIR/lisp 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 langage si vous tes intresss. Le chier .emacs du rpertoire HOME de l'utilisateur est excut automatiquement a dmarrage d'emacs. Si on ne veut pas qu'il s'excute (par exemple si ce chier contient de erreurs), on lance emacs avec l'option -q. 12.1.2 Sortir de emacs Sous X Window, le menu File permet de sortir de emacs. C-x C-c permet de sauvegarder (aprs demande de conrmation) les buers avant d sortir. 12.2 Concepts de base 12.2.1 Description d'une fentre emacs Une fentre ache par emacs est compose de : ) une barre de menus (seulement pour les versions sous graphiques en haut de la fentr ) la fentre de travail proprement dite o- s'ache le buer courant, sous la barre d menus, ) la ligne d'information, situe sous la fentre de travail, ) le mini-buer se trouve en bas de la fentre * il contient en gnral une seule lign Dans la version X Window, un ascenseur borde la droite de la fentre de travail. CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 64 Menus de la version graphique (X Window) 12.2. CONCEPTS DE BASE 6 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 File permet de charger, sauvegarder un chier, ouvrir une nouvelle fentre, imprimer ou supprimer un buer, sortir de emacs Edit permet de copier, couper, coller, dfaire l'eet d'une commande, remplir avec le plus de mots possible les lignes d'une rgion (Fill) Help permet d'obtenir de l'aide sur emacs ou une commande Unix De nombreux modes de travail (voir 12.2.5) modient ces menus ou ajoutent de nouvelles entres. Toutes les actions sous emacs sont excutes par des commandes dont le nom rappel le type de l'action excute : Ligne d'information sur le mode de travail L'utilisateur peut lancer ces commandes par leur nom en les prxant avec M-x. Pa exemple, La dernire ligne en bas de l'cran contient quelques indications utiles l'utilisateur : --**-Emacs : nom-buffer Commandes emacs next-line load-file kill-word goto-line save-buffers-kill-emacs M-x kill-word (mode majeur mineur)--L106--position-------- Les ** indiquent que le buer a t modi (on peut aussi avoir %% qui indique que le buer est readonly). mode majeur et mode mineur sont les modes de travail (voir 12.2.5). L106 dsigne le numro de la ligne courante. position peut tre All, Bot, Top ou nn% suivant que tout le texte est ach ou seulement la n ou le dbut, ou si nn% du texte est au dessus de la premire ligne ache. Mini-bu%er Les commandes tapes par l'utilisateur et les messages envoys par emacs sont achs sous la ligne d'information dans une zone appele minibuer. On peut annuler une commande en cours et ache dans ce minibuer en tapant C-g. Associations de cls Les actions les plus couramment employes sont associes des cls (combinaisons d touches du clavier). Il sut de taper la cl pour lancer la commande associe. Voici deu exemples : Commande Cl C-n C-x C-c Les autres commandes comme goto-line doivent tre lances avec M-x. Les associations ( bindings) peuvent tre modies (voir 12.4) et peuvent dpendre d mode de travail (voir 12.2.5). next-line save-buffers-kill-emacs 12.2.2 Commandes et associations de cls Complter automatiquement des noms de commandes emacs fait un grand usage de deux touches spciales notes C- et M- dans le manuel d'utilisation. C- dsigne la touche Ctrl]. Taper C-x revient appuyer sur la touche Ctrl], et appuyer sur la touche x tout en gardant la touche Ctrl] enfonce. Le maintien sur la touche Ctrl] est indiqu par le - qui suit le C. M- dsigne la touche Meta On l'utilise de la mme manire que la touche Ctrl]. Pour les claviers qui n'ont pas de touche Meta], la touche Alt] (ou la touche marque d'un } sur les claviers des machines Sun) joue souvent le mme rle. Sinon, on peut simuler M-x en tapant sur la touche Esc] avant de taper sur la touche x. Les commandes Certaines commandes ont des noms assez longs (par exemple goto-line). Il exist des facilits pour ne pas tre oblig de taper les noms en entier : on tape Tab] (touch de tabulation) ds que le nom de la commande peut se distinguer des autres noms d commandes * si on tape ESP] (barre d'espace), emacs complte un mot ds que ce mot s distingue des autres mots cls. Pour l'exemple de goto-line, il sut de taper g suivi d ESP] pour avoir goto- et l suivi de TAB]. Pour entrer une tabulation ou un espace, sut de les faire prcder de C-q. Si emacs ne peut complter parce qu'il y a plusieurs possibilits de compltions, il ach une fentre d'aide o- sont aches toutes les suites possibles. On peut alors parcourir cett fentre par C-M-v. On peut choisir une des commandes en cliquant sur son nom avec Touches spciales 66 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) bouton du milieu de la souris. Cette fentre se referme automatiquement quand on lance la commande complte. De mme, les noms de chiers taps dans le mini-buer (par exemple pour donner le nom d'un chier charger dans un buer) peuvent tre complts par emacs quand l'utilisateur tape la touche Tab] ou la barre d'espace. 12.2.3 Buers et fentres Tampon (ou bu%er) Chaque texte dit est conserv en mmoire centrale dans un buer. Plus gnralement, toute activit de emacs (aide en ligne, courrier lectronique, etc.) est eectue dans un buer. On peut travailler avec plusieurs buers en mme temps. Chaque buer a un nom. Le nom d'un buer associ un chier est le nom terminal du chier. Si on travaille avec plusieurs chiers qui ont le mme nom terminal, un numro est accol la n du nom du buer. Sous X Window, le menu Buers permet de choisir un buer. Fen&tre emacs emacs ouvre une premire fentre au dmarrage. Par la suite l'utilisateur peut diviser cette fentre en plusieurs sous-fentres. Une fentre emacs visualise une portion de buer et permet de travailler avec les donnes aches. Deux fentres peuvent visualiser des portions direntes d'un mme buer ou visualiser des buers dirents. Le menu File permet de grer les fentres : Split Window pour dcouper la fentre en cours en deux, ou One Window pour fermer toutes les fentres sauf une (pour cela, on peut aussi, dans les versions graphiques cliquer avec le bouton du milieu de la souris sur la ligne d'information de la fentre choisie). On peut accder une fentre en cliquant avec le bouton gauche dans la fentre. Fen&tre X ('frame( dans le manuel en anglais) Sous X Window, l'utilisateur peut ouvrir une nouvelle fentre X pour y acher le buer courant. Il peut ensuite y charger un autre buer ou y visualiser une autre partie du buer courant comme il le ferait pour une fentre emacs. Chaque fentre X possde son propre menu. Pour ouvrir une nouvelle fentre X, le plus simple est d'utiliser le menu File, choix Make New Frame. La fentre peut tre ferme par le mme menu, choix Delete Frame. 12.2. CONCEPTS DE BASE 6 12.2.4 Point d'insertion, marque, rgions Point d'insertion Le point d'insertion indique l'endroit o- les modications apportes au texte par l'ut 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. Chaque tampon a un point d'insertion. Rgion La rgion est la zone de texte comprise entre le point d'insertion et la marque. La marque peut tre positionne dans le texte en tapant C-<barre d'espace>ou impl citement par des manipulations de la souris. C-x h met tout le texte du document comme rgion M-h met tout le paragraphe comme rgion Utilisation de la rgion et de l'anneau de suppression Plusieurs commandes permettent de manipuler une rgion (une zone de texte) et d l'enregistrer dans un anneau de suppression. emacs conserve dans un anneau de suppression (commun toutes les fentres) le textes supprims par les commandes qui suppriment plus d'un seul caractre (C-k, Cmais pas C-d, DEL] ou Backspace]). La commande M-w permet aussi d'ajouter des texte cet anneau sans les supprimer : C-w supprime la rgion (attention au w trompeur !) et la place dans l'anneau de sup pression M-w enregistre la rgion dans l'anneau de suppression L'utilisateur peut ensuite rutiliser les textes ainsi conservs : C-y colle le dernier texte plac dans l'anneau de suppression l'endroit du poin d'insertion 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. Dans un environnement X Window, on peut utiliser le menu Edit pour supprime copier ou coller une rgion. On peut aussi utiliser la souris : Double-clic sur le bouton gauche enregistre le mot point par la souris dans l'anneau de suppression Triple-clic sur le bouton gauche enregistre la ligne pointe dans l'anneau de suppression Bouton du milieu colle l'endroit du clic un texte prcdemment copi ou coup (idem C-y) 68 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) Bouton droit copie le texte plac entre le point et l'endroit du clic pour tre coll ensuite (idem M-w). 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 bouton gauche, du dbut la n d'un texte, permet de dnir une rgion et de l'enregistrer dans l'anneau de suppression. 12.2.5 Mode de travail Emacs permet de travailler en plusieurs modes de travail adapts au type de texte que l'on tape et au type de travail auquel ce buer est associ. Il existe par exemple un mode de travail pour crire un programme en langage C et des modes pour envoyer et recevoir du courrier lectronique depuis emacs. Chaque fentre emacs a un mode de travail majeur en cours. On peut aussi lancer des modes mineurs qui modient lgrement le fonctionnement des modes majeurs. Nous n'tudierons pas ces modes dans ce cours. Voici seulement une description rapide du mode dired qui peut tre trs utile. 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 dired-mode. Ce mode est trs pratique pour se dplacer dans l'arborescence : on clique avec le bouton du milieu sur le nom du rpertoire o- l'on veut aller ou sur le chier que l'on veut charger dans un buer. Dans ce cas, l'achage se fait dans une deuxime fentre. Si on tape f sur la ligne qui contient le curseur, l'achage se fait dans la mme fentre. On peut aussi copier et supprimer des chiers. On se reportera l'aide en ligne d'emacs et aux menus oerts par ce mode pour en savoir plus. 12.3 Commandes 12.3.1 Commandes de base Insertion Par dfaut emacs est en mode insertion : tout caractre non spcial (achable) tap est insr l'endroit du point. C-q permet d'insrer un caractre non achable tap la suite Suppression Backspace supprime le caractre avant le point C-d supprime le caractre situ aprs le point (donc plac sous le curseur) 12.3. COMMANDES C-k 6 eace la n de la ligne (situe aprs le point) et la place dans l'anneau de sup pression Dplacer le point d'insertion Les terminaux sont souvent congurs 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 dplacer d'un cran. On peut aussi utiliser les commandes ci-dessous : C-a va au dbut de la ligne C-e va la n de la ligne M-< va au dbut du chier M-> va la n du chier Dans un environnement X Window, Bouton gauche dplace le point l'endroit du clic On peut aussi utiliser la barre de dlement pour se dplacer. Barre de dlement ou 'ascenseur( (Scroll Bar) Toutes les fentres X Window associes emacs possdent une barre de dlemen verticale droite de la fentre. Cette barre reprsente tout le texte. Un rectangle intern plus ou moins long, reprsente la portion du texte actuellement ache. On utilise la souris pour se dplacer dans le texte l'aide de cette barre. Les utilisateur de Windows sur PC ou du Macintosh remarqueront que la manipulation de la barre d dlement est dirente sous emacs. Cette manipulation est identique la manipulatio des ascenseurs sous le client X Window xterm (voir cours sur X Window). Bouton gauche 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 texte. Bouton du milieu dplace l'endroit du clic le rectangle interne la barre de dlement. Le texte ach es le texte correspondant la position nouvelle du rectangle interne. Si on veut se dplace vers la n du chier, on clique donc sous le rectangle interne. On peut aussi cliquer sur le rectangle interne de l'ascenseur avec ce bouton et glisser pou se dplacer contin.ment dans le texte. Bouton droit dplace l'endroit du clic la ligne place en haut de la fentre. Le texte est donc dplac vers le dbut du chier d'au plus un cran. Plus on clique bas, plus on remonte dans texte. 70 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) Sauvegarder un chier Les chiers chargs dans un buer ne sont modis que lorsque l'utilisateur indique explicitement qu'il veut sauvegarder les modications qu'il a eectues sur le buer. C-x C-s sauvegarde le buer courant Sous X Window le menu File permet aussi de sauvegarder les chiers sous son nom actuel (Save Buer ) ou sous un autre nom (Save Buer As...). Remarque 12.1 L'ancienne version du chier (s'il ne s'agit pas d'un nouveau texte) est conserve sous l'ancien nom suivi du caractre ~. emacs eectue des sauvegardes automatiques intervalles rguliers. Ces sauvegardes sont eectues dans des chiers dont le nom est le nom du chier modi entour du caractre #. Ces sauvegardes sont supprimes en cas de n d'dition normale. S'il y a eu une sortie anormale d'emacs et si vous n'avez pu sauvegarder vos chiers, ces sauvegardes automatiques vous permettent de rcuprer les bonnes versions de vos chiers. De plus, si vous voulez charger un des chiers qui n'a pu tre sauvegard normalement et si emacs s'aper'oit qu'il y a un chier # plus rcent que le chier que vous voulez charger, emacs vous envoie le message Auto save le is newer* consider M-x recover-le. Vous pouvez alors taper M-x recover-le et rcuprer automatiquement la version enregistre dans la sauvegarde automatique. 12.4. PERSONNALISATION DE EMACS 7 12.3.2 Autres commandes Rechercher du texte C-s C-r C-M-s eectue une recherche incrmentale (les caractres sont recherchs au fur et mesure qu'ils sont taps) du texte tap vers la n du buer. Pour passer l'occu rence suivante, on retape C-s. Pour arrter la recherche, on tape la touche Retur ou une commande de dplacement. On peut ensuite relancer la mme recherch en tapant C-s C-s. eectue une recherche incrmentale vers le dbut du chier. Pour passer l'oc curence suivante, on retape C-r. eectue la recherche d'une expression rgulire (voir chapitre 11). Remplacer une cha)ne de caractres par une autre M-% La question Query replace s'ache. On doit alors entrer la cha ne de caractre remplacer suivie de Return]. Il s'ache alors with et l'on entre la cha ne d remplacement suivie de Return]. A chaque fois que la cha ne remplacer est rencontre, l'utilisateur peut ta per : y ou n pour remplacer ou non, q pour arrter de remplacer, ! pour tout remplacer jusqu' la n, 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 ncessaires. Le chier ~/.emacs est excut au dmarrage de emacs. Il doit contenir du code Lisp 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 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 du menu Help Describe Variable) ou les associations de touches sont trs simples : Dfaire (' undo() Si l'utilisateur s'est tromp il peut annuler la plupart des commandes qu'il a tap. Sous X Window, il peut utiliser pour cela le choix Undo du menu Edit. Il utile de noter que C-g sort du minibuer d'entre des commandes en annulant la commande que l'utilisateur est en train de taper. On peut ainsi se sortir d'un mauvais pas lorsqu'emacs vous ache continuellement le mme message dans le mini-buer parce que vous avez lanc une commande par une 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. (setq inhibit-startup-message t) aecte la valeur t (true) la variable inhibit-startup-message pour viter d'avoir message initial de emacs (global-set-key find] 'isearch-forward) associe la commande de emacs isearch-forward la touche du clavier Find qui pourr ainsi tre utilise pour lancer une recherche. Les noms des touches reconnus par emacs son achs par la commande C-h k ou par le menu Help Describe Key. 1. Plus exactement, elisp, une variante du langage Lisp 72 CHAPITRE 12. DITEUR DE TEXTE (EMACS, XEMACS) 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 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. Depuis la version 20 un environnement minimum peut tre install pour tous les utilisateurs d'emacs. Cet environnement est dni 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 de fa'on signicative la taille de votre chier .emacs. Si des options ne vous conviennent pas, allez consulter ces chiers pour voir comment changer les choix qui y ont t faits. 12.5 Complments pour les versions graphiques Copier ou coller entre fen&tres X Window Quand un texte est copi ou coup (dans l'anneau de suppression) il peut tre coll dans une autre fentre X Window, mme s'il ne s'agit pas d'une fentre associe emacs. Inversement, on peut coller dans emacs un texte prcdemment copi ou coup dans une autre fentre X Window. Choix de la police de caractres sous X Window S-BD (Shift + bouton droit de la souris) ache un menu qui permet de choisir la police utilise. On choisira plutt une police espacement xe du type Courier 14 ou 7x14. 2. La plupart des versions d'emacs ne sont pas crites au-dessus de la bote outils Xt et tous les chiers de ressources ne sont pas utilis s 7 Chapitre 13 Manipulation des donnes des chiers 13.1 Tri (sort) sort options] fichiers...] trie les lignes des chiers (regroupes ensemble). La sortie se fait sur la sortie standard Par dfaut, les lignes viennent de l'entre standard. 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 cographique (et selon le code ASCII) et selon l'ordre croissant par dfaut. Options pour indiquer la cl de tri : +pos1 pos2 permet d'indiquer le dbut et la n d'une zone de la cl de tri. Le coup +pos1 )pos2 indique que la zone de tri commence au champ numro pos + 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 de champ est dnie ci-dessous dans la dnition de l'option -t. -tsparateur indique le caractre qui spare les dirents champs. Si un sparateur n'est pas dni, les champs sont spars par toute suit 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 Autres options : -c ache un message si les lignes ne sont pas dans le bon ordre (et dans ce ca CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 74 -ochier -r -u renvoie un code retour gal 1 au lieu de 0) sort le rsultat du tri dans chier. Attention l'erreur suivante : sort chier > chier qui dtruit chier avant de le trier (voir redirections en 14.2). La bonne commande est sort -ochier chier inverse l'ordre de tri. On peut aussi accoler la lettre r derrire +pos1 si on ne veut trier par ordre dcroissant que certains champs. si plusieurs lignes ont la mme valeur pour la cl de tri, une seule de ces lignes est envoye sur la sortie standard. Exemples 13.1 (a) Tri de /etc/passwd sur le numro de l'utilisateur : 13.4. CONVERSION, SUPPRESSION DE CARACTRES (TR) ache le nombre de lignes, de mots, de caractres et le nom de chaque chier. Si des chier ne sont pas spcis, l'entre standard est prise par dfaut. Options -l -w -c nombre de lignes seulement nombre de mots seulement nombre de caractres seulement Exemples 13.3 (a) Nombre de chiers de /bin : ls -A /bin | wc -l (b) Compter les lignes, mots et caractres de tous les chiers du rpertoire courant don le nom commence par b : sort -t: +2n -3 /etc/passwd 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 : ls -lgA | sort +4n -5 +8 13.2 Recherche d'une chane de caractres (grep) grep options] expr-reg fichiers...] ache sur l'cran les lignes des chiers, qui contiennent une cha ne de caractres correspondant l'expression rgulire expr-reg (voir chapitre 11. L'entre standard est prise par dfaut si des chiers ne sont pas spcis. Le code retour renvoy est 0 si l'expression rgulire a t trouve ou 1 sinon. Si expr-reg comporte des caractres spciaux pour le shell (* ou par exemple), il ne faut pas oublier de les protger en les entourant d'apostrophes ou de guillemets (voir 14.8). -c -i -n -v Options wc b* 13.4 Conversion, suppression de caractres (tr) La commande tr permet de convertir ou de supprimer des caractres provenant d l'entre standard. Conversion de caractres tr -cs] chane1 chane2 transforme les caractres provenant de l'entre standard ainsi : les caractres contenus dan chane1 sont transforms en les caractres correspondants de chane2 et les autres caractre sont conservs tels quels. Le tout est envoy vers la sortie standard. Si chane2 contient moins de caractres que chane1, le dernier caractre de chane remplace les caractres manquants. On peut dsigner un caractre par son code ASCII en octal prcd par n. On peu dsigner un intervalle de caractres : e-l dsigne les lettres minuscules comprises entre et l (bornes comprises). En Unix systme V, la syntaxe est plutt e-l]. ache seulement le nombre de lignes contenant la cha ne ignore la dirence entre minuscules et majuscules ache les numros des lignes ache les lignes qui ne contiennent pas la cha ne Exemple 13.2 Exemples 13.4 ( > est le prompt dans les exemples suivants) ~> tr aeiou AEIOU bonjour Ctrl] D bOnjOUr grep -c '^bin' fichier ache le nombre de lignes de chier qui commencent par bin. 13.3 Compter les caractres, les mots, les lignes (wc) wc options...] fichiers...] 7 (b) (a) ~> tr "a-z" "A-Z" abcd Ctrl] D ABCD CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 76 (c) cat toto | tr ae AE > totobis ou tr ae AE > totobis < toto -c Options 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. -s (squeeze) ne garde en sortie qu'un seul exemplaire d'une suite d'un mme caractre de chane2. Exemple 13.5 tr -cs a-zA-Z '\012' ache l'entre au clavier, un mot (cha ne compose uniquement de lettres) par ligne (\012 est le caractre passage la ligne de code 10 en dcimal, 012 en octal). Suppression de caractres tr -d chane envoie vers la sortie standard les caractres re'us dans l'entre standard s'ils ne sont pas inclus dans cha ne. tr supprime au passage tous les caractres inclus dans cha ne. Exemple 13.6 ~> tr -d ac abcad Ctrl] D bd ~> 13.5 Fractionnement vertical (cut) cut -cliste fichiers...] dcoupe un ou plusieurs chiers (entre standard par dfaut) verticalement en slectionnant des intervalles de caractres (comme l'indique l'option -c) conserver dans chaque ligne. Le rsultat est envoy sur la sortie standard. liste est une liste de nombres entiers spars par des virgules avec ventuellement des tirets pour indiquer un intervalle. Le dcoupage se fait sur les numros de caractres (le premier caractre a le numro 1). Cette liste indique quels seront les caractres qui seront conservs sur chaque ligne. Exemples 13.7 (a) 1,3,8 dsigne les caractres situs en position 1, 3 et 8 (b) 2-5,10 dsigne les caractres situs en position 2 5 et 10 13.5. FRACTIONNEMENT VERTICAL (CUT) (c) -5,8 (d) 3- (e) 12-20,4-15 7 dsigne les caractres situs en position 1 5 et 8 dsigne les caractres situs en position 3 la n de la ligne dsigne les caractres situs en position 4 20 Les caractres seront toujours achs dans l'ordre qu'ils ont sur la ligne du chier, qu que soit l'ordre donn dans la liste (voir exemple b ci-dessous). Exemples 13.8 (a) cut -c-5,10-15 fichier1 fichier2 extrait les 5 premiers caractres et les caractres 10 15 de chaque ligne de fichier et de fichier2 et les ache sur l'cran (b) cut -c10-12,4-11 fichier extrait les caractres 4 12 de chaque ligne. On remarquera que les caractres 10 e 11 ne sont achs qu'une seule fois. cut -fliste -ddlimiteur] -s] fichiers...] dans ce cas le dcoupage se fait sur des champs (comme l'indique l'option -f) dlimite par dlimiteur (option -d * tabulation par dfaut). Attention, si plusieurs dlimiteurs sont accols, ils dnissent 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). Les lignes sans dlimiteur sont conserves en entier. L'option -s indique qu'il ne fau pas conserver les lignes sans dlimiteur. liste est une liste de nombres entiers spars par des virgules avec ventuellement de tirets pour indiquer un intervalle. Le dcoupage se fait sur les numros de champs ( premier champ a le numro 1). Cette liste indique quels seront les champs qui seron conservs sur chaque ligne. Les caractres seront toujours achs dans l'ordre qu'ils ont sur la ligne du chier, qu que soit l'ordre donn dans la liste. Exemples 13.9 (a) cut -f1,5 -d: /etc/passwd ache les utilisateurs et le commentaire associ du chier /etc/passwd (b) Compter combien il y a de clients distincts dans un chier de factures dont chaqu ligne correspond un client plac en tte de ligne (tabulation entre chaque zone d'un ligne) : cut -f1 factures | sort -u | wc -l CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 78 13.6 Comparaison du contenu de 2 chiers 13.7. TRAITER LES LIGNES CONSCUTIVES IDENTIQUES (UNIQ) Exemple 13.11 $ cmp fich1 fich2 fich1 fich2 differ : char 160, line 5 13.6.1 Dirences entre deux chiers texte (di) diff -e] fichier1 fichier2 indique quelles lignes doivent tre changes dans chier1 pour qu'il soit identique chier2. 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. Le rsultat n'est pas toujours facile comprendre. La lettre a indique que des lignes ont t ajoutes chier2 par rapport chier1, d indique que des lignes ont t supprimes, c que des lignes ont t changes. Les nombres avant la lettre sont des numros de lignes de chier1 et les numros qui suivent la lettre sont des numros de lignes de chier2. Les lignes de chier1 sont prcdes de <, celles de chier2 sont prcdes de >. Exemple 13.10 ~> cat f1 ab c e fg h ~> cat f2 ab e f u ~> diff f1 f2 2d1 < c 4,5c3,4 < fg < h --> f > u 13.6.2 galit du contenu de 2 chiers (cmp) cmp -s] fichier1 fichier2 ache le premier octet dirent dans les 2 chiers. -s Option 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. 7 13.7 Traiter les lignes conscutives identiques d'un chier (uniq) uniq -cdu] fichier] n'ache qu'un seul exemplaire des lignes de chier] (entre standard par dfaut). Si plu sieurs lignes conscutives sont identiques, une seule est envoye vers la sortie standard Cette commande ne considre pas deux lignes identiques si elles ne sont pas conscutive (il faut faire un tri pralable si on veut les prendre en compte). -c -d -u Option ache chaque ligne en un seul exemplaire, en la faisant prcder du nombre d lignes voisines identiques n'ache que les lignes identiques (en un seul exemplaire) n'ache que les lignes en un seul exemplaire 13.8 Extraire le dbut ou la n d'un chier 13.8.1 Dbut d'un chier (head) head -n] fichiers...] sort sur la sortie standard les n premires lignes de chacun des chiers (de l'entre standar par dfaut). Par dfaut, n est gal 10. Exemple 13.12 head -5 fich* 13.8.2 Fin d'un chier (tail) tail dbut] fichier] copie la n du chier sur la sortie standard. 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 caractres et non pas en lignes. Si le chier n'est pas indiqu, tail prend l'entre standard par dfaut. Exemples 13.13 (a) tail +120 fich (b) tail -2b fich 80 CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 13.9 Un diteur non interactif (sed) 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 de l'entre standard par dfaut), les traite suivant un programme et sort le rsultat du traitement sur la sortie standard. sed est souvent utilis comme ltre dans un pipe. Comme pour la commande awk vue la section suivante, nous ne verrons qu'une petite 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 traitement indiqu dans commande. commande doit tre un mot pour le shell (donc entour 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. sed -n] -f fichier-pgm fichiers...] indique que le programme est enregistr dans un chier. L'option -n indique que les lignes lues ne doivent pas tre automatiquement renvoyes 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 de la commande s). Une grande partie des traitements eectus par sed peut tre excute par awk. awk est plus puissant mais sed est plus simple d'emploi pour remplacer une cha ne de caractres par une autre (commande s). 13.10. UN LANGAGE D'DITION DE FICHIERS (AWK) 8 aucune adresse qui dsigne toutes les lignes. 13.9.4 Excution du programme sed applique chaque commande du programme la premire ligne du chier trait. passe ensuite la ligne suivante et ainsi de suite. Chaque commande s'applique la version de la ligne courante dj modie par le commandes dj excutes sur cette ligne. 13.9.5 Commandes Les commandes les plus utilises sont s pour substituer une cha ne de caractres une autre, d pour supprimer des lignes, p pour envoyer des lignes vers la sortie standard. On peut regrouper plusieurs commandes avec { et }. Exemple 13.14 for dir in `echo $PATH | sed -e 's/:/ /g'` do ......... lignes indique les lignes sur lesquelles la commande sed sera applique. L'argument permet de prciser le traitement eectuer sur les lignes. 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 remplacer une cha ne de caractres par une autre (commande s). On remarquera que le chier trait n'est pas modi par sed. Si on veut modier u chier de fa'on non interactive, le plus simple est d'utiliser l'diteur ed avec un chie 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) 13.9.2 Structure d'une ligne de programme lignes commande arguments Les lignes sont numrotes de 1 au nombre de lignes re'ues. L'adresse d'une ligne peut tre dsigne par un numro de ligne, par $ (dernire ligne) ou par une expression rgulire entoure de /. Les lignes traites peuvent tre dsignes par : adresse1, adresse2 qui dsigne un ou plusieurs blocs de lignes comprises entre les lignes dsignes par les deux adresses adresse qui dsigne toutes les lignes correspondant l'adresse 13.10.1 Description gnrale de la commande awk 1 lit un texte contenu dans un ou plusieurs chiers, le modie et envoie le rsulta vers la sortie standard. awk est une commande trs puissante pour travailler sur le contenu d'un chier. Elle po sde un langage de programmation comportant des structures conditionnelles, des boucle et des fonctions prdnies * ce langage peut travailler avec des variables et des tableaux Nous n'tudierons ici que les fonctionnalits les plus simples oertes par awk. 1. du nom de ses d veloppeurs Aho, Weinberger et Kernighan CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 82 Il est fortement conseill d'tudier plus en dtail cette commande si l'on veut eectuer des traitements complexes sur le contenu des chiers. Un langage encore plus puissant est fourni par le langage Perl qui ne sera pas tudi ici. Le traitement eectuer est crit dans un programme tap directement dans la ligne de commande (forme 1 de la syntaxe) ou enregistr dans un chier (forme 2 de la syntaxe). awk -Fc] programme fichiers...] ou awk -Fc] -f fichier-programme fichiers...] 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 mot par le shell * en gnral, il est donc ncessaire de l'entourer par des apostrophes ou des guillemets. Excution de la commande : awk travaille sur des enregistrements constitus de champs. Le sparateur d'enregistrement tant par dfaut le sparateur de ligne de Unix, awk travaille ordinairement sur des lignes. awk lit enregistrement par enregistrement les donnes des chiers (l'entre standard par dfaut). Chaque enregistrement est trait son tour selon les indications donnes par toutes les instructions du programme, avant la lecture de l'enregistrement suivant. 13.10.2 Champs Quand awk lit un enregistrement d'un chier, il l'clate en champs spars par des 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,... reprsentent les 1er 2eme ,... champs $0 reprsente la ligne entire. Exemples 13.15 (a) Acher le nom, les autorisations et le propritaire des sous-rpertoires du rpertoire courant : ls -lg | awk '/^d/ { print $9, $1, $3 }' (b) Acher les noms des utilisateurs : awk -F: '{print $1}' /etc/passwd 13.10.3 Structure d'un programme Un programme peut tre complexe et comporter de nombreuses lignes incluant toutes les structures de programmation que l'on trouve habituellement dans les langages de programmation comme le langage Pascal ou le langage C. 13.10. UN LANGAGE D'DITION DE FICHIERS (AWK) 8 Une ligne d'un programme a la structure suivante : slecteur { action } slecteur indique si action doit tre excute sur l'enregistrement en cours de traitement Dans ce cours nous ne verrons que les programmes comportant une seule ligne qu ache (par la commande print) des portions de lignes du chier trait. Les constantes de type cha ne de caractres sont entoures par des guillemets. On peut inclure des commentaires dans une ligne du programme en les faisant prcde du caractre #. 13.10.4 Cas particuliers pour une ligne de programme ) S'il n'y a pas de slecteur, action est toujours excute (pour tous les enregistrements Exemple 13.16 ls -lg | awk ' { print $9, $5 }' ache le nom et la taille (les neuvime et cinquime champs de la ligne) de chiers du rpertoire courant. ) S'il n'y a pas d'action, l'enregistrement trait est recopi vers la sortie s'il a t slectionn par slecteur. Exemple 13.17 L'exemple de 13.18 pourrait donc s'crire plus simplement. ls -l | awk '/^d/' 13.10.5 Slecteurs Ils peuvent tre du type : ) /expression rgulire/ Dans ce cas, action sera excute sur un enregistrement s'il contient une cha ne d caractres qui correspond expression-rgulire (voir 11). Exemple 13.18 ls -l | awk '/^d/ { print }' ls -l ache toutes les lignes de courant. concernant les sous-rpertoires du rpertoir ) expression de comparaison (semblables celles du Langage C) : ==, !=, <, >, <=, >= De plus, ~ (tilde) permet de comparer une cha ne de caractres une expressio rgulire (place entre deux /). Par exemple, $5 ~ /^0-9]/ CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 84 ) expression compose des deux types prcdents relis par des oprateurs logiques || (ou), && (et), ! (ngation de l'oprateur qui suit) ) mots cl BEGIN ou END. Si le slecteur de la premire (resp. dernire) ligne du programme est BEGIN (resp. END), l'action de cette ligne sera excute une fois avant (resp. aprs) de traiter le premier (resp. dernier) enregistrement des chiers. Des exemples d'utilisation de ces mots cls sont donns en 13.11. Exemples 13.19 (a) $2 == "" (b) $2 == "1" || $2 =="5" (c) $2 !~ /^ab/ (d) $2 > 3 (e) /^$/ # deuxieme champ ne commence pas par ab # ligne vide Le format gnral d'un programme est donc : BEGIN { instruction de d-but } s-lecteur { action } .... .... s-lecteur { action } END { instruction de fin } 13.10.6 Actions Une action est une suite d'instructions. Comme en Langage C plusieurs actions peuvent tre regroupes entre accolades. Une instruction se termine par un *, un passage la ligne ou par une accolade fermante. Une instruction peut tre une instruction de contrle, une aectation, print ou printf. Les instructions de contrle disponibles sont : if, while, for, break, continue, next, exit. 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 instructions composes de plusieurs instructions sont entoures d'accolades : { if (n > 1000) { i++ somme += $4 } } 13.10. UN LANGAGE D'DITION DE FICHIERS (AWK) 8 Pour une description plus dtaille, on se reportera au manuel de rfrence ou, encor mieux, un guide d'utilisation de awk. Des exemples d'utilisation des instructions de contrle sont donns dans la sectio suivante. Voyons un peu plus en dtails print et printf : > print expressions...] fichier] ou print expressions...] fichier] >> ache les expressions sur la sortie standard ou vers le chier ventuellement spci e redirection. print eectue ensuite un passage la ligne. Si les expressions qui suivent print sont spares par un ou plusieurs espaces, elle sont sorties accoles les unes derrire les autres. Si elles sont spares par une virgule, elle sont sorties spares par un espace. 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. print (seul) ache l'enregistrement complet. Variables utilisateur Des variables peuvent tre utilises dans les programmes. La syntaxe de leur utilisatio 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 Acher la taille totale des chiers achs par la commande ls : ls -lg | awk ' { print $9, $5 somme = somme + $5 } END { print "Total des tailles des fichiers :", somme }' Remarque 13.1 Les constantes cha nes de caractres doivent tre entoures par des guillemets sino elles sont considres comme des noms de variables par awk. C'est une source d'erreu frquente lorsque l'on commence programmer avec awk. Variables systme Voici quelques variables systme utilises par awk : nombre de champs de la ligne nombre de lignes qui ont t lues sparateur de champs en entre (par dfaut l'espace ou la tabulation) sparateur de champs en sortie (par dfaut l'espace) NF NR FS OFS CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 86 RS sparateur d'enregistrements (line feed de code 10 par dfaut). RS="" indique que le sparateur d'enregistrement est la ligne vide. C'est utile pour travailler avec des enregistrements multi-lignes. FILENAME nom du chier en cours de traitement FS, OFS et RS sont modiables par le programme. 13.10.7 Fonctions, oprateurs On peut utiliser des fonctions (de syntaxes semblables aux fonctions du Langage C) dans les slecteurs et les actions. Pour faire des calculs : int, sqrt, log, exp, int,... Pour travailler avec des cha nes de caractres : substr, length, index,... La fonction getline permet de lire une ligne ou la valeur d'une variable : getline lit une ligne du chier en cours. getline variable lit une ligne du chier en cours et met la valeur dans variable. On peut spcier en entre un autre chier pour getline par une redirection de l'entre : getline variable ] < chier La valeur lue par getline peut aussi provenir d'une commande Unix : commande j getline variable ] Pour lancer une commande Unix, on dispose de la fonction system . Par exemple, system("rm fichier") On peut utiliser aussi des calculs avec les oprateurs du langage C : +, -, *, /, %, ++, ), +=, *=, /= et %= Exemple 13.21 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. 13.11 Exemples de programmes ) Acher le nombre de lignes du chier : awk 'END { print NR }' fichier ) Acher le premier et le dernier champ de chaque ligne : awk '{ print $1, $NF }' fichier ) Acher le nom et la taille des chiers du rpertoire courant : ls -alg | awk '{ print $9, $3 }' 13.11. EXEMPLES DE PROGRAMMES 8 ) Acher le nom et la taille des chiers du rpertoire courant avec un format de sort plus agrable (le nom cadr gauche dans un champ de 20 caractres et la tail cadre droite dans un champ de 6 caractres) : ls -alg | awk '{ printf "%-20s %6d\n", $9, $4 }' ) Acher les lignes qui contiennent ab ou cde : awk '/ab/ || /cde/' ) Acher tous les intervalles de lignes qui sont incluses entre deux lignes gales debut et n : awk '/^debut$/,/^fin$/' ) Acher les lignes dont le premier champ est dirent de celui de la ligne prcdente awk '$1 != prev { print # prev = $1 }' ) Voici un chier programme adjacents que l'on peut appeler par awk -f adjacents fichier pour reprer les mots adjacents identiques dans un chier : NF>0 { if ($1 == derniermot) print "double %s, ligne %s\n", $1, NR for (i=2 # i<=NF # i++) if ($i == $(i-1)) printf "double %s, ligne %s\n", $i, NR if (NF>0) derniermot = $NF } ) Acher les groupes auxquels l'utilisateur appartient : awk -F: /:,]`logname`'($|,)/{ printf "%s\n", $1 }' /etc/group Remarquez l'expression ($|,) qui indique que le nom d'utilisateur est suivi pa une virgule ou par la n de la ligne. ) Plier les lignes qui ont plus de 50 caractres dans un chier (on ajoute un \ droit des lignes plies : length($0) > 72 { print substr($0,1,50) "\\" ligne = substr($0,51) while (length(ligne) > 50) { print substr(ligne,1,50) "\\" CHAPITRE 13. MANIPULATION DES DONNES DES FICHIERS 88 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 toto 300 bibi 150 Le programme achera : toto 550 bibi 350 jean 200 Voici le programme : { somme$1] += $2 } END { for (nom in somme) print nom, sommenom] } for (nom in somme) Remarquez le qui parcourt le tableau. On peut utiliser l'lment d'un tableau comme condition d'un if. Dans ce cas, la condition 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 csplit fold paste comm join Fractionnement horizontal d'un chier en chiers de tailles xes (on peut recoller les morceaux par cat) Fractionnement horizontal d'un chier selon le contenu des lignes du chier (on peut recoller les morceaux par cat) dcoupe les lignes trop longues en plusieurs lignes Recollement vertical (en colonnes) de plusieurs chiers (le contraire de cut) Slection/rejet de lignes communes 2 chiers Jointure sur une zone commune (au sens des bases de donnes relationnelles) de 2 chiers tris suivant cette zone Troisime partie Mcanismes d'interprtation du shell 9 Chapitre 14 Interprtation du shell. Mcanismes de base 14.1 Gnralits sur le shell 14.1.1 Dnition 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 congurs 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 ou CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE zsh -o NOCLOBBER set -o NOCLOBBER 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 NO_NOMATCH (voir 4.5) et ne pas positionner les options GLOBDOTS et NOCLOBBER. Dans ce cas, l'incompatibilit principale de zsh avec les autres shells provient de la fa'on d'indiquer la ngation de caractres pour la gnration des noms de chiers : ! ] pour sh et ksh et ^ ] pour zsh. 14.1.3 Commandes et processus, commandes internes au shell Suivant les cas, une ligne tape au clavier peut lancer aucun, un ou plusieurs nouveaux processus (voir 2.2) : ) La plupart des lignes de commandes tapes par l'utilisateur entrainent l'excution d'un chier binaire enregistr dans l'arborescence des chiers. Le shell lance l'excution de ce chier aprs avoir interprt la ligne de commande. Cette excution engendre un nouveau processus. ) Certaines lignes de commandes peuvent engendrer plusieurs processus (par exemple les lignes de commandes comportant un pipe). ) D'autres commandes sont internes au shell * le shell sait les excuter sans faire appel 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. 14.1.4 Prompts Le shell indique qu'il est prt prendre une nouvelle commande en achant le prompt (par dfaut le prompt est $ ). Une commande se termine par un passage la ligne. Dans certains cas le passage la ligne n'est pas considr comme un terminateur de commande par le shell * dans ces cas, il s'ache un deuxime prompt ( > par dfaut) pour indiquer que le shell attend la suite de la commande : $ echo "LIGNE 1 > LIGNE 2" LIGNE 1 LIGNE 2 14.1.5 Environnement d'une commande ou d'un shellscript Toutes les commandes lances dans Unix s'excutent dans un environnement de travail dni par un ensemble de variables (voir chapitre 15). 14.2. REDIRECTIONS 9 Cet environnement peut guider les commandes pendant leur excution. Par exemple, l commande lpr envoie les requtes d'impression vers l'imprimante dont le nom est conten dans le variable PRINTER si cette variable fait partie de l'environnement. 14.1.6 Code retour d'une commande Toute commande Unix renvoie un code retour. En gnral, le code retour est gal 0 si tout s'est bien pass et un entier strictemen 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. Remarque 14.1 Ce code retour ne s'ache pas 1 * il est enregistr dans la variable ? du she (voir 15.2.6). Il peut tre ach par la commande echo $?. La touche d'annulation (souvent Ctrl] C * voir 3.3) permet d'interrompre l'excutio d'une commande si elle n'a pas t lance en arrire-plan. Le code retour est alors en gnra dirent de 0 (cela dpend de la manire dont a t crite la commande * voir command interne trap en 17.5). 14.2 Redirections Avant de lancer un processus, le shell 2 lui associe 3 chiers : Entre standard (par dfaut le clavier) * le descripteur de chier est 0. Sortie standard (par dfaut l'cran) * le descripteur de chier est 1. Erreur standard (par dfaut l'cran) * le descripteur de chier est 2. Ces 3 descripteurs peuvent tre lis d'autres chiers que ceux indiqus ci-dessus gr&c aux commandes de redirection. Le shell va associer d'autres chiers que le clavier ou l'cra ces 3 descripteurs et il lancera ensuite la commande. 14.2.1 Redirections de la sortie standard Redirection avec crasement du chier de redirection (>) On redirige la sortie standard d'une commande dans un autre chier que le chie spcial associ l'cran, par la redirection >chier 1. Sous zsh, l'option print_exit_value fait acher le code retour s'il est di rent de 0 2. C'est une convention adopt e par tous les shells et par l'immense majorit des programmes cri pour Unix CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 94 Cette redirection associe le chier chier au descripteur 1. Tout ce qui est envoy vers la sortie standard (connue par la commande comme le chier de descripteur 1) est donc envoy chier. La redirection doit tre crite la suite de la commande sur laquelle elle agit. Si chier existait dj, son contenu est cras * s'il n'existait pas, il est cr. Remarque 14.2 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 souhaite craser un chier s'il existe dj, il faut utiliser le signe de redirection >! Exemples 14.1 (a) ls - l > (b) fich cat fich1 fich2 > fich3 Redirection avec ajout la n du chier de redirection (>>) Il faut utiliser >> au lieu de >. Exemple 14.2 ls -l >> fich 14.2.2 Redirection du chier d'erreur (2>) Le chier d'erreur peut tre redirig en ajoutant 2>chier ( 2>>chier, si on ne veut 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.2.3 Envoi d'un message d'erreur (>&2) Les message d'erreur doivent tre envoys vers la voie numro 2. Voici un exemple (voir 16.4.4) : echo "ERREUR" >&2 14.2.4 Redirection de l'entre standard (<) L'entre standard peut tre redirige par <chier. Exemple 14.4 mail [email protected] < fichier 14.3. PIPE (j) 9 14.2.5 Pseudo-chier /dev/null Le chier spcial de type caractres (voir 1.6.2) /dev/null est un pseudo-chier qu valent un puits sans fond. Il est souvent utilis avec les redirections, en particulier pour ignorer les message d'erreur : find /students -name core -print 2>/dev/null 14.3 Pipe ( ) j Les donnes de sortie d'une commande peuvent tre directement utilises comme don nes d'entre d'une autre commande gr&ce au symbole |. En eet, la sortie standard d la commande de la commande place avant le | est redirige vers l'entre standard de l commande place aprs le |. 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 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). Le code retour du pipe est le code retour de la dernire commande excute dans pipe. Exemples 14.5 (a) ls -l /bin | grep '^d' (b) On peut composer plusieurs pipes : ls -l /bin | grep '^d' | lpr 14.4 Regroupement des commandes Le regroupement de commandes est souvent utilis pour appliquer une redirection o un pipe plusieurs commandes. 14.4.1 Regroupement entre parenth ses Les commandes regroupes entre des parenthses sont excutes dans un sous-shell ave un environnement dirent de celui prcdant et suivant les parenthses. Exemple 14.6 $ pwd /users/students/toto 3. Dans les dernires versions de zsh, la dernire commande s'ex cute dans le shell dans lequel le pipe t lanc 96 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE $ (cd /bin # pwd) /bin $ pwd /users/students/toto 14.4.2 Regroupement entre accolades Les commandes regroupes entre des accolades ne sont pas excutes dans un sous-shell comme avec les parenthses. Les accolades doivent tre spares des commandes par au moins un espace. 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 ce qui prcde. L'oubli du * est frquent et il est dicile reprer car le shell n'indique pas clairement le problme dans ses messages d'erreur. Exemple 14.7 { echo "Fichiers fich1 et fich2 :" # pr fich1 fich2 # } | lpr -h 14.5 Processus en arrire-plan (&) Lorsqu'on lance une commande, le shell attend la n de l'excution de la commande avant d'excuter une autre commande. Si on ajoute le signe & derrire le nom de la commande (prcd ou non d'un espace), le shell n'attend plus la n de son excution. On dit qu'il lance la commande en arrire-plan. Exemple 14.8 ls -l | grep '^d' > fich & Quand on lance une commande en arrire-plan dans un shell interactif (pas dans un shellscript), le shell renvoie l'cran le numro de job entre crochets (le premier processus 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 (tudie en 7.2). Remarque 14.3 Lorsque l'utilisateur sort du systme (en fait, du shell lanc au dmarrage), tous les processus lancs en arrire-plan sont tus. Pour tre prcis, il existe une commande nohup (pas tudie ici) qui permet de lancer des commandes en arrire-plan, qui continueront leur excution aprs la sortie de l'utilisateur. Les commandes at et batch permettent de lancer en arrire-plan des commandes des moments choisis ou lorsque le systme n'est pas trop charg, mme si l'utilisateur n'est pas connect. 14.6. ALIAS 9 14.5.1 Gestion des jobs par ksh ou zsh En ksh ou zsh (mais pas sous sh) l'utilisateur dispose de plusieurs commandes pou 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 le shell en cours et leur pid (voir 2.2), en tapant jobs -l] (l'option -l ache l'identicateur de processus) ) l'utilisateur peut suspendre le processus en cours en tapant Ctrl] Z ) il peut ensuite relancer l'excution de ce processus en arrire-plan en tapant bg %n] n est le numro de job pour le shell (voir 14.5) * par dfaut c'est le processus qu 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 fg %n] (si aucun numro de job n n'est donn, la commande lance en avant-plan le dernie processus lanc en arrire-plan). Ceci permet de suspendre momentanment un processus pour eectuer un travail e de revenir ensuite ce processus exactement l'endroit o- on l'avait laiss. On peut pa exemple crire un programme sous emacs, enregistrer ce programme, suspendre emacs pa Ctrl] Z, compiler et excuter le programme et revenir sous emacs par fg. Cette possibilit perd de son utilit si l'on travaille en environnement X Window car on peut alors facilemen passer d'une application l'autre sans devoir en suspendre une. 14.6 Alias Un alias est un synonyme pour une cha ne de caractres dans une commande. Les alia sont particuliers ksh et zsh * il n'y a pas d'alias dans le shell sh. Par exemple, alias x='chmod u+x' dnit l'alias x : si le premier mot d'une com mande est x, le shell remplacera ce mot par chmod u+x. On peut dfaire un alias par la commande unalias, par exemple, unalias x. La liste des alias peut s'acher en tapant alias sans argument. alias x ache l valeur de l'alias x. Un alias peut tre utilis comme raccourci d'une commande avec ses options comm pour l'alias x ci-dessus. On peut aussi l'utiliser pour dsigner une commande qui n'es pas place dans un des rpertoires de la variable PATH. Par exemple (sous Unix OSF), 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 sur la sortie standard. Cette section dcrit comment les lignes de commandes sont interprtes par le she avant que la commande ne soit lance. Voici les t&ches eectues par le shell dans l'ordre de leur excution : 1. interprtation des espaces (pour distinguer les dirents mots), 2. substitution de tilde (~) (seulement pour ksh ou zsh), 3. substitution des alias (seulement pour ksh ou zsh), 4. interprtation des redirections, des pipes 4 et des regroupements de commandes, 5. interprtation des aectations 5, 6. substitution des paramtres de position et de variables ($), 7. substitution des commandes, 8. gnration des noms de chiers (caractres * ? ] * voir 4.5.1). Exemples 14.9 (a) date=`date` (b) nom_maj=`echo $nom | tr 'a-z' 'A-Z'` (c) echo je suis sous `pwd` Remarques 14.4 (a) le code retour d'une aectation a=`commande` est le code retour renvoy par commande. On peut ainsi crire if ligne=`grep mot fichier` # then # cas ou grep a trouve une ligne else # cas ou grep n'a pas trouve une ligne fi (b) la commande est excute dans un sous-shell. (c) Attention, si la commande renvoie plusieurs lignes vers la sortie standard, le comportement est dirent selon que l'on travaille sous sh et ksh ou zsh. Par exemple, a=`ls -l` rangera dans a une seule longue ligne sous sh et ksh, ce qui peut tre gnant, mais donnera bien plusieurs lignes sous zsh. (d) l'interprtation l'intrieur des ` est complexe et peut donner des rsultats surprenants : echo \\$HOME \/users/profs/toto ache echo `echo \\$HOME` $HOME , et pourtant ache A cause de ce type d'exemple, ksh et zsh ont ajout le nouveau type de substitution de commande $(commande) qui n'a pas de telles anomalies : echo $(echo \\$HOME) \/users/profs/toto ache 14.9 Inhiber l'interprtation du shell On peut inhiber l'interprtation du shell (on dit aussi dpersonnaliser) avec les carac tres suivants : n inhibe l'interprtation spciale du caractre suivant. ' toute interprtation est inhibe pour les portions de lignes entoures de ' " dans les portions de lignes entoures de " (guillemets), l'interprtation des e paces, la gnration des noms, la substitution des alias et de ~ sont inhibe mais pas la substitution des paramtres ($). Une apostrophe n'est pas interprt entre deux guillemets (ce qui permet d'introduire le caractre ' dans une cha n de caractres. Exemple 14.10 Essayez cette suite de commandes : a=bonjour echo $a bc * echo \$a bc echo "\$a bc echo '$a *' *" 4. il n'y a pas de g n ration des noms de chiers dans l'interpr tation des parties correspondant au chiers dans les redirections 5. comme pour les redirections, les tapes suivantes sont aussi trait es part pour les aectations pa exemple, aucune g n ration des noms n'est eectu e dans a=* 100 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.10 Recherche d'une commande par le shell Lorsque l'utilisateur tape une commande au clavier, voici les direntes tapes qui conduisent l'excution de la commande : 1. Interprtation de la ligne de commande par le shell, 2. Recherche de la commande, 3. Excution de la commande avec redirection pralable des entres-sorties par le shell si ncessaire. Voici comment s'eectue la recherche de la commande : ) Si la commande correspond une commande interne du shell, cette commande est excute l'intrieur du shell, ) sinon, si la commande correspond une fonction (voir 16.3), cette fonction est excute l'intrieur du shell, ) sinon il ne peut s'agir que d'une commande correspondant un chier de l'arborescence. 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 est un shellscript un nouveau shell est cr * il lit les lignes du shellscript et les excute, ) si le chier contient du code binaire excutable, un nouveau processus est cr, qui excute ce code. 14.11 Lancement de l'excution d'un shellscript Un shellscript est un chier qui contient des noms de commandes et des instructions internes au shell. On peut utiliser un shellscript comme toutes les autres commandes. En particulier un autre shellscript peut l'utiliser. On peut ainsi se construire facilement de nouvelles commandes adaptes sa propre fa'on de travailler. Les instructions internes du shell forment un langage de haut niveau possdant des instructions de tests et de boucles, des variables et des fonctions. On peut lancer l'excution d'un shellscript de trois manires direntes. 14.11.1 Lancement par le nom du shellscript Si on a l'autorisation de lecture et d'excution sur le shellscript, on peut le lancer en tapant simplement son nom. 14.11. LANCEMENT DE L'EXCUTION D'UN SHELLSCRIPT 10 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 pour lire et excuter les lignes contenues dans le chier. 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 ls (dont la zone de code contient le code de l'interprteur) qui lit les lignes du shellscript e lance leur excution. Si le shellscript modie l'environnement de dpart, celui-ci est rtab lorsque l'excution du shellscript est termine (voir 15.2.9). Il est important de noter que, sauf cas particulier tudi ci-dessous (#!), ) 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), ) si on travaille sous zsh, l'interprteur lanc implicitement est sh et pas zsh ! Si chier contient des instructions comprises par zsh et pas par sh, il y aura une erreu l'excution. Pour que le shellscript soit interprt par zsh, il doit commencer par la ligne : #! /usr/local/bin/zsh -f Excution d'un chier dont la premire ligne commence par '#!( 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 #! (avec ventuellement un argument comme -f dans l'exemple ci-dessus), auquel il ap plique comme arguments la ligne de commande tape par l'utilisateur. Voici des exemple concrets : Si l'utilisateur tape la commande c1 f1 f2, ) si c1 commence par #! /bin/sh, la commande excute sera /bin/sh c1 f1 f2. Le shellscript c1 est lu par le shell sh et excut avec les arguments f1 f2. ) si c1 commence par #! /usr/local/bin/zsh -f, la commande excute sera /usr/local/bin/zsh -f c1 f1 f2. Le shellscript c1 est lu par le shell zsh et excut avec les arguments f1 f2. L'optio -f indique que le chier d'initialisation .zshenv ne doit pas tre lu * voir 14.11.3 ) si c1 commence par #! /bin/awk -f, la commande excute sera /bin/awk -f c1 f1 f2. Le programme c1 (ncessairement crit avec du code awk) est interprt par aw sur les chiers f1 et f2 (voir 13.10). Remarque 14.5 Ce mcanisme ne peut fonctionner qu'avec les interprteurs (tels les shells ou awk pour lesquels # introduit des commentaires. 102 CHAPITRE 14. INTERPRTATION DU SHELL. MCANISMES DE BASE 14.11.2 Lancement par l'appel de la commande interne . Il reste une autre possibilit pour faire excuter un shellscript. Le nom du shellscript 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 directement au clavier. Un nouveau processus n'est pas cr. Les modications de l'environnement seront donc conserves. En fait, . est une commande interne du shell qui lit toutes les commandes contenues dans le chier et les excute comme si elles avaient t tapes au clavier. Remarque 14.6 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. 14.12. LANCEMENT EXPLICITE D'UN SHELL 10 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 comme shell de dmarrage (voir cours sur les rseaux). 14.12 Lancement explicite d'un shell zsh -f] Les chiers .zshenv, .zshrc et /etc/zshrc sont excuts sauf si le shell est lanc ave 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 xterm . CHAPITRE 15. VARIABLES, ENVIRONNEMENT 104 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 : Chapitre 15 Variables, environnement 15.1 Paramtres, variables de position 15.1.1 Param tres des shellscripts Lorsqu'on lance une commande, on peut la faire suivre par des arguments ou paramtres. 4 l'intrieur d'un shellscript, ces paramtres sont dsigns par les variables de position $1, $2,..., $9 ($0 dsigne le nom de la commande). Exemples 15.1 (a) Si le shellscript lt contient ls -lt $1 | more on peut lancer lt /users/students/jean (b) Si le shellscript cherche contient find $1 -name "$2" -print on peut taper cherche /usr "compt*" qui cherchera sous l'arborescence du rpertoire /usr les chiers dont le nom commence par compt. 15.1.2 Donner des valeurs aux param tres de position (set) 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, $2, ... : set val1 val2 ... set `date` echo $2 $6 Remarque 15.1 set -x abc 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.2 Variables 15.2.1 Identicateur Durant une session de travail d'un shell (dlimite par le dmarrage et l'arrt du shell on peut utiliser des variables dsignes par un identicateur. Cet identicateur peut com porter des lettres, des chires ou le caractre soulign * il doit commencer par une lettre o le caractre soulign. 15.2.2 Aectation On peut aecter une cha ne de caractres aux variables : variable=valeur (pas d'espaces de part et d'autre du signe = !). variable= aecte la cha ne vide variable. Remarque 15.2 Le code retour d'une aectation du type a=`commande` est le code retour renvoye par la commande. On peut par exemple crire if lignes=`grep mot fichier` # then ... et ce qui suit le then ne sera excut que si le chier contient le mot. 15.2.3 Dsignation de la valeur de la variable ($) On peut rutiliser la valeur aecte une variable dans toute commande. CHAPITRE 15. VARIABLES, ENVIRONNEMENT 106 $variable dsigne la valeur de variable. C'est le shell qui fera le remplacement. Remarque 15.3 Le shell ne fera pas le remplacement dans les portions de commande places entre apostrophes ou si le $ est prcd d'un \. Au contraire de la gnration de noms de chiers, le remplacement est eectu dans les portions de commande places entre guillemets (voir 14.8). Exemple 15.2 r1=/us2/acct/jean/dvp r2=/us2/bin cd $r1 cp fich $r2 Si la valeur de la variable doit tre suivie d'un caractre autoris dans un nom de variable, on entoure d'accolades le nom de la variable : Exemple 15.3 serie=math cp classe/${serie}1 rep 15.2.4 Dcomposition en mots des valeurs des variables de zsh Attention ! zsh ne dcoupe pas la valeur d'une variable en mots. Le programme suivant va copier les deux chiers f1 et f2 sous le rpertoire rep s'il est excut sous sh ou ksh, mais il ne fonctionnera pas sous zsh car cp essaiera de copier le chier de nom f1 f2 (un seul nom avec un espace au milieu) : fichiers="f1 f2" cp $fichiers repertoire ${=fichiers} Il faut crire si on veut que la valeur de la variable chier soit dcoupe en mots. Sous zsh la commande de l'exemple prcdent doit donc s'crire : cp ${=fichiers} repertoire 15.2.5 Supprimer une variable (unset) unset variable Remarque 15.4 La commande unset n'existe pas dans le shell sh. 15.2.6 Variables spciales du shell Voici les principales variables utilises par le shell. HOME rpertoire de login 15.2. VARIABLES 10 PATH rpertoire de recherche des commandes Exemple : PATH=/bin:/usr/bin:/users/students/util:. Le rpertoire courant peut tre indiqu par : au dbut ou la n de la va leur de PATH. Il est recommand de ne pas mettre trop de rpertoires dan cette variable pour ne pas surcharger le systme en cas de recherche d'un commande qui n'existe pas (et qui sera recherche dans tous ces rpertoires CDPATH est une variable quelquefois utile si on travaille souvent dans des rpertoire dont le chemin est long taper. Si l'utilisateur tape un nom qui ne commenc pas par un / en argument de cd, cd recherchera ce nom dans les rpertoire indiqus dans CDPATH. Le format de CDPATH est le mme que celui d PATH. Attention, sous sh et ksh, si la variable CDPATH a une valeur, cette va riable est utilise exclusivement pour rechercher les rpertoires dont le nom ne commence par / dans une commande cd (comme pour la variab PATH et la recherche de commandes). Si on est par exemple plac dans so rpertoire HOME et que celui-ci contient un rpertoire bin, la command cd bin dplacera dans le premier rpertoire bin plac sous un des r pertoires de la variable CDPATH, et renverra une erreur s'il n'y en a pa 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 variable CDPATH. PS1 premier prompt Unix. zsh ore de nombreuses possibilits particulires pou personnaliser le prompt (voir 15.3). PS2 deuxime prompt Unix (> par dfaut) TERM nom du type de terminal utilis IFS sparateur(s) de mots dans les commandes (espace, tabulation ou passag la ligne par dfaut). IFS est utilise lors d'une substitution de command (`...` ou $()), de paramtre ou de variable ($), ou lors de la lecture d'un ligne par la commande interne read, pour dcouper une ligne en mots. O remarquera que IFS n'est pas utilise entre guillemets car les guillemet inhibent la sparation en mots. Essayez la suite de commandes suivante : $ IFS=/ $ read x y v1/v2 $ echo $x $ var=a/b/c $ echo $var # $=var avec zsh $ echo "$var" # different si entre guillemets $ cat /etc/passwd IFS= remet la valeur par dfaut. CHAPITRE 15. VARIABLES, ENVIRONNEMENT 108 Les variables suivantes ont leur valeur donne automatiquement par le shell * on ne peut modier leur valeur. # nombre de paramtres de position ? valeur retourne par la dernire commande excute ! numro de processus de la dernire commande lance en arrire plan $ numro de processus du processus en cours * $* est quivalent $1 $2 ... @ $@ est quivalent $1 $2 ... comme $* * mais il existe une dirence subtile entre les 2 variables * et @: "$*" (entour de guillements) reprsente un seul mot compos des arguments $1 $2 ... spars par un espace alors que "$@" 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.7 Acher la valeur d'une variable (echo) echo -n] $variable Plus gnralement, echo envoie sur la sortie standard les valeurs de tous ses paramtres, spars par un espace. Dans la commande ci-dessus, c'est le shell qui va remplacer $variable par la valeur de la variable et echo achera cette valeur. En Unix BSD, l'option -n permet d'viter le passage la ligne aprs l'achage. En Unix Systme V, on peut passer en paramtres de echo des caractres spciaux et c'est le 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 : echo "Donnez le nom du fichier \c: " Exemples 15.4 (a) echo valeur (b) de HOME : $HOME echo "Voici 5 espaces entre parentheses : ( )" Question : que se passe-t-il si on enlve les guillemets? La commande interne print de ksh et de zsh, permet des formats d'achage plus sophistiqus, mais cette commande n'existe pas dans le shell sh. 15.2.8 Entre de la valeur d'une variable au clavier (read) read variable... Une ligne est lue sur l'entre standard. Le premier mot est aect la premire variable, le deuxime mot est aect la deuxime variable,... La dernire variable re'oit le restant de la ligne. S'il y a moins de mots que de variables, les dernires variables sont initialises la cha ne vide. 15.2. VARIABLES 10 Le code retour est 0 sauf si on a atteint une n de chier. Exemples 15.5 (a) echo Nom du repertoire a lister : read rep ls -ld $rep | more pour lire au clavier le nom d'un rpertoire lister. (b) read v1 v2 v3 <fichier lit dans la premire ligne du chier les valeurs des variables v1, v2 et v3. On verra la page 131 comment lire toutes les lignes d'un chier. 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 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 Si on veut la rutiliser dans les programmes appels ultrieurement par le shell, on do exporter la valeur par export. Remarque 15.5 On dira que les programmes appels ultrieurement par un shellscript sont des de cendants du shellscript qui les a appels, ou que le shellscript est un anctre de ce programmes. export variables... recopie la valeur des variables dans l'environnement qui sera pass aux programmes appel ultrieurement. Remarques 15.6 (a) Puisque c'est une recopie, les ventuelles modications des variables exportes n modieront pas l'environnement du shellscript appelant. (b) ksh et zsh permettent d'aecter des valeurs des variables tout en exportant le variables : export a=3 fichier=fich12 On obtiendra une erreur si le shellscript est excut par sh et il faut donc l'viter. (c) export qui ne se comporte pas de la mme fa'on dans les tous les shells : ) avec sh, si un programme modie une variable qui a t exporte par un pro gramme anctre et s'il n'exporte pas cette variable (avant ou aprs sa modi cation), les programmes descendants qu'il appellera, recevront la valeur initia pour cette variable (et non la valeur modie). Si un programme modie la valeur d'une variable et veut transmettre la nouvel valeur aux programmes qu'il appelle, il doit donc exporter cette variable. CHAPITRE 15. VARIABLES, ENVIRONNEMENT 110 15.3. PERSONNALISATION DE L'ENVIRONNEMENT ) avec ksh et zsh, si une variable a t exporte par un programme, elle le sera automatiquement par tous les programmes appels par le programme. est le seul chier qui est toujours excut. Si ncessaire, il donne un environnemen minimum pour travailler. Si zsh a t lanc avec l'option -f, c'est le seul chier de conguration a tr excut. 15.2.10 Visualisation des variables disponibles (set, printenv) printenv ache les valeurs des variables de l'environnement du processus en cours (celles qu'il a recues et celles qu'il a exportes) * export (sans nom de variable) donne un rsultat semblable sous zsh et ksh, mais sous sh, export donne uniquement le nom des variables exportes par le shell en cours. 11 2. .zshenv 3. /etc/zprofile est toujours excut si zsh n'a t pas lanc avec l'option -f. Il initialise les va riables d'environnement indispensables au bon fonctionnement du shell dans tous le cas (PATH par exemple). set ache les valeurs des variables disponibles (mme celles qui ne sont pas exportes et qui n'appartiennent pas l'environnement qui sera transmis). 15.3 Personnalisation de l'environnement 15.3.1 Options des shells (set, setopt) De nombreuses options permettent de congurer le fonctionnement des shells (voir en particulier 14.1.2). Ces options peuvent tre entres en paramtres lors du lancement du 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. On a vu aussi en 3.3 l'option -o ignoreeof et on verra l'utilit des options -v et -x pour la mise au point des shellscripts en 17.11. La fonction interne setopt de zsh permet aussi de positionner les options du shell. On peut avoir une liste de toutes les options positonne en tapant setopt seul. 4. Dans les sections suivantes nous allons tudier les dirents chiers de conguration de l'environnement que le shell zsh excutent automatiquement au dmarrage. et .zshrc (excut par les shells interactifs seulement) contiennent les dnitions d'alias, d prompts et des variables lies l'utilisation interactive d'un shell. Remarque 15.7 Quand on ouvre une nouvelle fentre X Window, ces chiers sont excuts (apr les chiers /etc/zshenv et .zshenv) par le nouveau shell qui s'excute dans l fentre. Exemple 15.6 /etc/zshrc umask 022 # definition des alias alias ll='ls -l' alias x='chmod u+x' # definition prompt : ordinateur et repertoire courant PS1=%m'(%~) ' # definition de variables export PRINTER=17 export MAIL=/usr/spool/mail/$USER export MANPATH=/usr/man:/usr/local/man:/usr/local/X11R5 export SAVEHIST=300 HISTFILE=$HOME/.sh_history HISTSIZE=300 # Pour compatibilite avec ksh : setopt NO_NOMATCH export NULLCMD=: 15.3.2 Fichiers de personnalisation 4 chaque fois qu'un shell zsh est lanc, des chiers de conguration sont lus et excuts automatiquement par le shell. Certains chiers sont communs tous les utilisateurs et permettent l'administrateur du systme de leur donner un environnement minimum commun. Ce sont les chiers zshenv, zshrc, zprofile et zlogin du rpertoire /etc. Les autres chiers sont situs dans le rpertoire HOME de chaque utilisateur. Celuici peut les crer ou les modier sa convenance. Ce sont les chiers .zshenv, .zshrc, .zprofile et .zlogin Ces chiers ne sont pas toujours tous excuts. Voyons les dirents cas. 1. /etc/zshenv et .zprofile (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 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). 5. /etc/zlogin et .zlogin 112 CHAPITRE 15. VARIABLES, ENVIRONNEMENT (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 stty dec crt fi 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 case $terminal:-2 in 1) TERM=vt100## 2) TERM=xterm echo "Nom du DISPLAY ? " read DISPLAY## esac fi Remarque 15.8 Les chiers utiliss lors de l'criture de chiers de conguration (au moins ceux qui ne sont pas lis un shell de login) doivent tre dsigns par leur nom absolu car les shells peuvent tre lancs d'un autre rpertoire que le rpertoire de login. 15.4 Stratgie pour la personnalisation de l'environnement On travaille le plus souvent dans plusieurs domaines bien distincts, par exemple, un environnement pour le dveloppement en langage Java, un environnement pour le travail avec une base de donnes et un autre pour la recherche d'information sur le Web. Dans ce cas, il est prfrable d'avoir des environnements de travail dirents plutt que d'avoir un seul environnement alourdi par un grand nombre de variables et avec une variable PATH contenant de nombreux rpertoires. Pour cela le plus simple est d'allger les chiers d'initialisation vus ci-dessus en ne gardant que les lments qui seront utiles tous les environnements, et de crer un shellscript 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 travail et lancera les programmes ncessaires (par exemple, il ouvrira une nouvelle fentre X Window dans laquelle il lancera un programme pour travailler avec une base de donnes). 11 Chapitre 16 Complments sur le shell Ce chapitre donne quelques complments sur des notions dj tudies dans les deu chapitre prcdents. Il prsente aussi quelques nouveaux aspects moins essentiels du langag du shell. 16.1 Listes de commandes Un pipe est une suite de commandes spares par j. Le code retour d'un pipe est code retour de la dernire commande excute. Une liste de commandes est une suite de pipes 9ou de simples commandes * dans l suite, par commodit, pipe pourra dsigner une simple commande) spares par un de signes suivant : correspond une excution squentielle des pipes & correspond une excution squentielle des pipes sans attente de la n de l'ex cution du pipe prcdent && le pipe suivant n'est excut que si le pipe prcdent renvoie la valeur 0 (drou lement normal du pipe prcdent) jj le pipe suivant n'est excut que si le pipe prcdent ne renvoie pas la valeur (droulement anormal du pipe prcdent) Exemples 16.1 (a) rm fich (b) || echo Suppression impossible !! cat $2 | { write $1 || mail $1 #} shellscript qui envoie un message sur l'cran ou dans la bo te aux lettres d'un util sateur connect la machine locale. Quelques subtilits (false est une commande qui ne fait que renvoyer un code retou non nul * true est une commande qui ne fait que renvoyer un code retour nul) : false && echo 1 && echo 2 n'ache rien 114 CHAPITRE 16. COMPLMENTS SUR LE SHELL true && echo 1 && echo 2 ache 1 et 2 false || echo 1 && echo 2 ache 1 et 2 true || echo 1 && echo 2 ache 2 16.2 Ordre de priorit L'ordre de priorit des dirents signes qui ont une signication particulire pour le shell est (par ordre dcroissant) : 1. les redirections 2. j 3. && et jj 4. & et * 16.3 Fonctions Les shellsripts peuvent contenir des dnitions de fonctions qui pourront ensuite tre utilises dans le shell dans lequel elles ont t dnies. Les fonctions sont plus rapidement excutes que les shellscripts puisque le shell n'a pas aller chercher de chier pour l'excuter. De plus une fonction peut modier les variables du shell appelant puisqu'elle s'excute dans le mme environnement que ce shell. Dnition d'une fonction nom-fonction () { ... ... } L'accolade de n de fonction doit tre en dbut de ligne (ou prcde de *). Appel de la fonction nom-fonction param1 param2 ... 16.4. COMPLMENTS SUR LES REDIRECTIONS 11 Excution de la fonction Les commandes de la fonction s'excutent dans le shell dans lequel la fonction a t appele. Les $1, $2,... sont remplacs par les paramtres d'appel de la fonction (param param2,...). Exemple 16.2 Si la fonction lt est dnie par : lt () { ls -lt $1 | more } on pourra lancer la fonction par : lt /bin Place l'intrieur d'une fonction la commande return n joue le rle de la commande exit pour un shellscript : elle arrte l'excution de la fonctio en renvoyant le code retour n. 16.4 Complments sur les redirections 16.4.1 Redirection de l'entre standard sur chier inclus (<<) << 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 le signe <<. Le dlimiteur de n doit absolument tre le premier caractre dans sa lign (avec ventuellement des tabulations si on fait suivre << de - * voir ci-dessous) sino on obtient des messages du type n de chier inattendue car le dlimiteur n'a pas t reconnu. 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 signie que le shell ne do pas interprter les caractres spciaux (*, ?, `, ...) situs entre les deux dlimiteurs. Tou 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 modier un chie 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 : 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 de la commande (voir exemple ci-dessous). Comme la commande suivante, s peu CHAPITRE 16. COMPLMENTS SUR LE SHELL 116 tre prcd d'un intervalle de lignes qui indique les lignes sur lesquelles portera la commande ($ dsigne la dernire ligne). En fait, les cha nes de caractres peuvent tre des expressions rgulires et on peut se rfrer dans la deuxime cha ne une sous-cha ne de la premire. Par exemple, s/^\(^:]*\),\(.*\)$/\2 est le prenom de \1/ transformera Dupond,Pierre en Pierre est le prenom de Dupond. Consultez le manuel en ligne de ed pour plus de prcisions. 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 les 5 premires lignes. w sauvegarde le chier en cours d'dition. q quitte ed. La syntaxe d'appel de ed est : ed -s] fichier o- l'option -s indique que l'on ne veut pas que ed ache certaines informations comme, par exemple, le nombre d'octet enregistrs lors de la commande w. Exemple 16.3 ed -s $3 <<FIN 1,\$s/$1/$2/g w q FIN Le shellscript remplace ci-dessus remplace une cha ne par une autre dans un chier (par exemple : remplace ch1 ch2 fichier) 16.4.2 Redirection pour tout un shell (exec) La commande interne exec, outre le lancement d'une comande en remplacement du shell, permet des redirections qui seront valables jusqu' la sortie du shell. La commande suivante, place dans un shellscript, enregistrera tous les messages d'erreurs du shellscript dans le chier suivi.err, jusqu' la n du shellscript : exec 2>suivi.err 16.4.3 Descripteurs de chier suprieurs 2 On sait que les trois chiers standards sont ouverts avec les descripteurs 0, 1 et 2. Un shellscript peut ouvrir d'autres chiers en utilisant les descripteurs suprieurs 2. 16.4. COMPLMENTS SUR LES REDIRECTIONS 11 Si le signe de redirection < ou > est prcd d'un nombre entier, cela signie qu la redirection concerne le chier dont le descripteur est le nombre entier donn, et no l'entre, la sortie ou l'erreur standard. Il ne doit pas y avoir d'espace entre le numro et signe qui le suit. Exemples 16.4 (a) 3< fichier et 3> fichier ces deux commandes ouvrent chier avec le descripteur 3 (et non pas le descripteu 0 ou 1 s'il n'y avait pas eu le 3). La dirence est que la deuxime redirection cras fichier. (b) Pour fermer le chier ouvert avec le descripteur 3, on utilise les commandes <&- e >&- (pas d'espace aprs le signe de redirection) qui ferment les chiers d'entre et d sortie standard * la commande suivante ferme le chier de descripteur 3 : 3<&- 16.4.4 Redirection vers un chier dsign par son descripteur >&n (resp. <&n) signie 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 dup() en langage C). Il ne faut pas d'espace entre > et &. > fichier crase fichier et positonne le pointeur de poistions courante du chie au dbut du chier alors que >&n (ou <&n) dsigne un chier sans modier la valeur d position courante. Exemples 16.5 (a) Pour acher un message d'erreur : echo "$0: Erreur ...." >&2 (b) Si on veut faire imprimer les erreurs de syntaxe d'un programme en langage C : cc pgm.c 2>&1 | lpr car les erreurs sont rediriges vers la sortie standard qui est envoye par le pipe l commande lpr. 16.4.5 Ordre d'valuation des redirections Les redirections sont values de gauche droite. Par exemple, les deux redirection suivantes 1>fich1 2>&1 vont rediriger la sortie standard et le chier standard des erreurs vers ch1. Dans l'ordr inverse, seule la sortie standard aurait t redirige vers ch1. CHAPITRE 16. COMPLMENTS SUR LE SHELL 118 16.4.6 Redirection sans commande avec zsh 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 * c'est la commande cat par dfaut. Si on veut que zsh se comporte comme sh et ksh, on ajoute les lignes suivantes dans le chier .zshrc : NULLCMD=: export NULLCMD 16.5 Complments sur les variables 16.5.1 Valeurs par dfaut pour les variables Il est possible de substituer des valeurs aux valeurs des variables ou des paramtres de position comme suit (les valeurs relles des variables ou paramtres ne sont pas modies par ces substitutions sauf pour =). On dit qu'une variable est active si elle a re'u une valeur. Un paramtre de position est activ si la commande a t lance avec au moins autant d'arguments que le numro du paramtre. ${variable-mot} si la variable n'est pas active, elle est remplace par la valeur mot. ${variable?mot} si la variable n'est pas active, mot est ach et l'excution est arrte. Si mot est omis, un message standard est ach. ${variable+mot} si la variable est active, elle est remplace par mot, sinon la cha ne vide est substitue. ${variable=mot} si la variable n'est pas active, sa valeur devient mot. Ne marche pas pour les paramtres de position. Remarque 16.1 mot est interprt par le shell, sauf quand il suit un ?. Il peut ainsi tre une substitution de commande ou dsigner la valeur d'une variable. Exemples 16.6 (a) cd ${rep=$HOME} (b) var=${2?il manque des parametres} (c) cd ${DIR-$HOME} Si les signes -,?, +, = sont prcds du signe :, le comportement pour une variable gale la cha ne vide est le mme que pour une variable non active. Par exemple, 16.5. COMPLMENTS SUR LES VARIABLES 11 ${var:=val} donnera la valeur val la variable var si celle-ci est gale la cha ne vide. 16.5.2 Modier l'environnement d'une commande On peut modier l'environnement d'une commande en la prxant d'une ou de plusieur aectations de variables (spares par des espaces). Exemple 16.7 rep=/usr/bin commande arguments... Attention, la porte de cette aectation se limite la commande prxe * l'aectatio ne modiera pas l'environnement du shell dans lequel la commande aura t tape. Exemple 16.8 a=5 a=6 echo $a achera 5 et pas 6 car la commande echo est une commande interne au shell. Erreur ne pas faire : si l'on veut concatner deux valeurs dans une variable (pa exemple abc et def), en les sparant par un espace, ne pas crire a=abc def qui serait interprt comme le lancement de la commande def en lui exportant la valeu abc de la variable a. Ecrire plutt : a="abc def" 16.5.3 Facilits de ksh et zsh pour le traitement des valeurs d variables 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 ) : ${#variable} donne la taille du contenu de la variable. ${variable#modle} (o- modle est une cha ne de caractres pouvant contenir les caractres spciaux utilis par la gnration des noms de chiers par le shell) si modle correspond au dbut de l 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 ${variable##modle} la mme chose que ci-dessus mais on supprime la plus grande portion de texte du dbu qui correspond modle. ${variable%modle} ou CHAPITRE 16. COMPLMENTS SUR LE SHELL 120 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#*/} usr/local/bin est gal (sans le / du dbut) (b) Si on travaille avec ksh, on peut placer PS1='${PWD#$HOME/}$ ' .profile dans le chier pour avoir un prompt qui indique le rpertoire courant sans tre trop long pour les noms de rpertoire qui sont sous le rpertoire courant. 16.5.4 Modication interactive de la valeur d'une variable sous zsh (vared) zsh ore une facilit pour modier en interactif la valeur d'une variable avec la commande vared ( variable editor ). Par exemple, vared PATH permet de modier 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(~) samoa(~) abc def samoa(~) abc samoa(~) def tableau=(abc def) echo $tableau echo $tableau1] echo $tableau2] Quatrime partie Programmation 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 avoir ne, gt, ge, lt, le (pour = 6 , >, , <, ). CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 124 chane1 = chane2 vrai si les 2 cha nes sont gales chane1 != chane2 -t numro] -L chier vrai si les 2 cha nes ne sont pas gales vrai si le numro est le numro d'une voie ouverte sur un terminal (par dfaut, numro est gal 1, c'est--dire correspond la sortie standard) 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 peut aussi s'appeler -h pour certaines commandes externes. Remarque 17.1 Si un lien symbolique pointe sur un rpertoire, l'option -d est vraie sur ce lien. Il faut donc commencer par tester si c'est un lien symbolique si on veut faire la dirence. On peut combiner ces conditions avec les oprateurs logiques -a et logique -o ou logique ! ngation logique On peut regrouper avec des parenthses (entoures d'un espace de part et d'autre et prcdes par n pour qu'elles ne soient pas interprtes par le shell). Exemples 17.1 (a) test -d (b) $1 && echo OUI || echo NON test \( -d fich -o -f fich2 \) -a $var = oui De plus ksh et zsh orent un mcanisme interne pour tester les expressions conditionnelles : expression conditionnelle ]] (des espaces sont ncessaires entre expression conditionnelle et les doubles crochets). Les expressions sont les mmes que pour test mais le et logique se traduit par && et le 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 = modle est vrai si chane correspond modle qui peut contenir les caractres spciaux utiliss dans la gnration des noms de chiers (voir 4.5). Aucune gnration des noms de chiers n'est eectue par le shell dans expression conditionnelle. Exemple 17.2 $fichier = *.c ]] 17.2. DCALER LES PARAMTRES DE POSITION (SHIFT) 12 17.2 Dcaler les paramtres de position (shift) shift n] dcale les paramtres de position de n positions. Par dfaut n est gal 1 : $2 devient $ $3 devient $2, etc. shift est souvent utilis par les structures de contrle de rptition pour utiliser tou de rle les dirents paramtres de position (voir exemples en 17.4.4). Exemple 17.3 Si le shellscript decale contient shift echo $1 l'excution de decale 1 2 achera 2. 17.3 Sortie d'un shellscript (exit) exit n] 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). Exemple 17.4 exit 1 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. Remarque 17.2 Il faut se mer des constructions des shells qui crent implicitement un sous-she (voir 14.3 ou 17.4.7). Si une commande exit s'excute dans un de ces sous-shells, el ne fera sortir que du sous-shell et pas du shellscript. 17.4 Les structures de contrle 17.4.1 if .. then .. else .. Les commandes Unix renvoient toute un code retour qui est un nombre entier (voir 14.1 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 positif. La commande if prend en compte ce code renvoy par les commandes. 126 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS if liste-commandes # then liste-commandes else liste-commandes fi teste la valeur renvoye par la liste de commande qui suit le if (code de la dernire commande de la liste excute). Si la valeur est nulle, la liste de commandes qui suit le then est excute, sinon c'est la liste qui suit le else qui est excute. Remarque 17.3 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 #. La prsentation choisie dans ce cours suit le format couramment utilis en langage C (else align avec le if ). Le then est plac sur la mme ligne que le if et il est donc prcd d'un #. Exemples 17.5 (a) if cp rep1/* rep2 # then : else echo "Impossible de copier les fichiers" >&2 fi (b) !crivons un shellscript oui qui pourra tre utilis par d'autres shellscripts. Il renverra 0 si l'utilisateur rpond oui et il renverra 1 sinon : read reponse if test "$reponse" = oui # then exit 0 else exit 1 fi On peut utiliser ce shellscript dans un autre shellscript comme suit : echo -n "Confirmez-vous la suppression ? " if oui # then rm * fi Remarque 17.4 Puisqu'en l'absence de commande exit, un shellscript sort avec le code retour de la dernire commande excute, le shellscript oui pourrait aussi s'crire : read reponse test "$reponse" = oui 17.4. LES STRUCTURES DE CONTRLE 12 Variantes de if if liste-commandes # then liste-commandes fi if liste-commandes # then liste-commandes elif liste-commandes # then liste-commandes elif ... ... ... else liste-commandes fi Cette structure est un raccourci plus simple et plus lisible pour la structure suivante if liste-commandes # then liste-commandes else if liste-commandes # then liste-commandes else if ... ... ... ... else liste-commandes fi fi fi Exemple 17.6 if test "$reponse" = oui # then exit 0 elif test "$reponse" = non # then exit 1 else exit 2 fi 128 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.4.2 case ... esac case mot in modle1) liste-commandes ## . . modlen) liste-commandes ## esac case est une instruction de choix multiple : le premier modle rencontr qui correspond la valeur de mot indique la liste de commandes excuter. Si mot ne correspond aucun des modles, l'excution se poursuit l'instruction qui suit esac. Les modles sont de la forme : val1 | val2... | valp Dans les modles, on peut utiliser les caractres spciaux ? * ] comme dans les noms de chiers (voir 4.5). On peut ainsi tester si une valeur commence par un chire par le modle 0-9]*. Exemple 17.7 Le shellscript oui donn en b peut s'crire : read reponse case "$reponse" in o|O|oui|OUI) exit 0 ## n|N|non|NON) exit 1 ## *) exit 2 ## esac 17.4.3 for ... do ... done Il est frquent d'avoir un traitement qui se rpte pour chaque paramtre d'une commande (par exemple, lpr ch1 ch2). La commande for permet de traiter successivement tous les paramtres d'une commande. Elle permet aussi de rpter un traitement pour plusieurs valeurs direntes. for variable in mots...] do liste-commandes done variable prend tour de rle pour valeur chaque mot de la liste mots qui suit in. Pour chaque valeur de variable, liste-commandes est excute. Si in mots... n'est pas prsent, variable prend pour valeur chacun des paramtres de la commande (ce qui est quivalent : for variable in $@ * voir 15.2.6). Remarque 17.5 Une boucle for sans in ne modie pas les valeurs de $1, $2,... 17.4. LES STRUCTURES DE CONTRLE Exemples 17.8 (a) for i in 12 1 2 3 do echo $i done (b) Pour voir la dirence entre $* et $@, excutez le shellscript suivant avec quelque paramtres, remplacez ensuite $* par $@ et excutez le nouveau avec les mme paramtres. Notez la dirence. Dans la premire version on n'a qu'un seul tour car $* est considr comme un mot unique. for i in "$*" do echo $i done (c) Le shellscript cherche suivant ache les chemins d'accs des chiers donns e argument : for fichier do find / -name "$fichier" -print done Il sura de taper cherche fich1 fich2 fich3 pour faire acher les chemins d'accs des chiers spcis. Si on veut ajouter quelques tests et entrer la racine de la recherche en premier para mtre, le shellscript cherche devient : if test $# -lt 2 # then echo "$0 : Il faut au moins 2 arguments" >&2 exit 2 fi if test ! -d $1 # then echo "$0 : $1 n'est pas un repertoire" >&2 exit 3 fi racine=$1 shift for fichier do find $racine -name "$fichier" -print done CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 130 (d) Pour excuter un traitement (ici acher le nom) sur tous les chiers d'un rpertoire on utilise la substitution de commande : for i in `ls -A` do echo $i done 13 do cherche "$1" "$2" shift 2 done (d) Lecture ligne ligne d'un chier structur en lignes : 17.4.4 while ... do ... done while liste-commandes1 do liste-commandes2 done excute liste-commandes2 tant que liste-commandes1 renvoie un code 0. Exemples 17.9 (a) while test "$1" do echo $1 shift done while read ligne do echo $ligne done < fichier 17.4.5 until ... do ... done Est semblable while mais la sortie de la boucle s'eectue si la liste de commandes qu suit until renvoie une valeur nulle. 17.4.6 Instructions lies aux boucles (continue, break) continue n] ache tous les paramtres, un par ligne. Retenez le test sur $1 pour reprer le dernier paramtre. (b) Si le shellscript coucou contient : while : do echo coucou sleep 30 done permet de sauter la n de la boucle et de recommencer une nouvelle boucle. break n] provoque la sortie de la boucle en cours d'excution et passe l'instruction qui suit l boucle. 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 englobe la boucle dans laquelle cette instruction est crite. 17.4.7 Probl mes avec les boucles rediriges et les pipes Si on tape coucou & il s'achera coucou sur l'cran toutes les 30 secondes (ne pas rediriger sur le terminal du collgue !). La commande interne : est une commande qui ne fait rien et renvoie le code retour 0 (voir 17.6). (c) Pour rechercher dans l'arborescence une liste de chiers ($2) situs sous des rpertoires dirents ($1), on peut utiliser le shellscript suivant (le shellscript cherche a t crit en c) : while "$1" ] 17.4. LES STRUCTURES DE CONTRLE # teste la fin de la liste 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). Ceci implique les deux problmes suivants : ) une commande exit ne sortira pas du shellscript mais seulement de la boucle ou d pipe, ) les aectations de variables l'intrieur de la boucle ne seront pas connues en dehor de la boucle ou du pipe. Remarque 17.6 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 (vriez-le tout d mme pour la version du shell que vous utilisez). 132 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS Voici des mthodes (de type bidouillage) pour contourner ces deux problmes dans le cas d'une boucle redirige : ) Pour le problme du exit, il n'y a pas de solution miracle. On doit s'adapter chaque cas particulier. On peut envoyer un code retour spcial avec la commande exit l'intrieur de la boucle (par exemple 5) et on teste le code retour juste la sortie de la boucle. On peut ainsi sortir du shellscript si le code retour lu est le code spcial choisi. ) Pour l'aectation de variable, il n'y a pas non plus de solution simple. On peut crire l'aectation dans un chier temporaire que l'on excute avec la commande . (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 vrier), echo "var=valeur" > ftemp$$ On peut aussi dans certains cas utiliser la substitution de commande comme il est dcrit ci-dessous pour le pipe. C'est alors la solution la plus propre'. ) Pour le pipe, une solution est d'utiliser un chier temporaire qui contient les informations 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 faire acher par ce shellscript les informations que l'on veut rcuprer, et d'utiliser une substitution de commande pour rcuprer ces valeurs. Cette dernire solution est aussi utilisable dans le cas d'une boucle redirige. 17.5 Interception des signaux trap liste-commandes] n... Le plus souvent, un processus s'interrompt quand il re'oit un signal (voir 2.2.1). La commande trap permet un comportement dirent la rception du signal : liste-commandes 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 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, la n de l'excution du chier de commande qui contient l'instruction trap) ou la sortie de la fonction (voir 16.3) dans laquelle a t dni le trap. Si liste-commandes est la cha ne nulle (indique explicitement par '' : 2 apostrophes accoles), le signal est ignor. Si liste-commandes est absente, le signal sera nouveau trait normalement. trap (sans aucun paramtre) ache la liste des commandes associes chacun des signaux. La liste de commandes du trap est lue et interprte une premire fois quand le shell lit la ligne qui comprend la commande trap et le rsultat de la premire interprtation est interprte une deuxime fois si la liste de commande est excute aprs la rception d'un signal. 17.5. INTERCEPTION DES SIGNAUX 13 Ces signaux sont pour la plupart des signaux d'interruption pour cause de droulemen anormal (erreur au niveau du bus, mmoire insusante, etc.) ou d'interruption par l'util sateur (l'appui sur la touche d'annulation correspond au signal numro 2). La command kill (tudie en 7.2) permet d'envoyer un signal un processus repr par son numro. Exemples 17.10 (a) trap '' 2 # les deux apostrophes designent la chaine vide ignore l'interruption par la touche d'annulation (b) trap 2 rtablit la prise en compte de cette touche (c) temp=temp$$ trap 'rm -f $temp # exit 2' 1 2 15 supprime le chier temporaire dont le nom est compos de la cha ne temp suiv 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 de l'utilisateur. Porte d'un trap : Le trap est en activit dans un shellscript partir du moment oest lu et jusqu' ce qu'un autre trap sur le mme signal soit lu. Les sous-shell n'hriten pas d'un traitement du signal initi par un trap. Cependant, si un shellscript ignore u signal, le signal ne sera pas transmis ses ls. Exemples 17.11 (a) Lancez le programme suivant, tapez sur la touche d'annulation et voyez le messag s'acher l'cran. trap "echo $0 : fin de programme # exit 2" 2 coucou o- coucou est le shellscript suivant : while : do echo coucou sleep 5 done (b) Le schma ci-dessous permet d'interrompre commande en tapant la touche d'annu lation, sans interrompre le programme principal * l'excution reprend la suite d programme. trap "trap '' 2" 2 # les guillemets pour entourer la chaine CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 134 # avec les deux apostrophes commande trap '' 2 Suite du programme... Si le premier trap tait trap '' 2, on ne pourrait pas interrompre la commande. 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 deuxime trap (plac aprs la commande) : le signal 2 ne serait plus ignor dans la suite du programme. 17.6 Commandes internes diverses : commande nulle (elle peut tre suivie de commentaires sur la mme ligne). Elle renvoie le code 0 ce qui permet de construire des boucles innies (voir exemple de while de la page 130). eval chanes... 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 permet de construire des commandes complexes morceau par morceau et des les excuter ensuite. Elle permet aussi des astuces qui sont lies une double interprtation du shell comme dans l'exemple suivant. Exemple 17.12 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 eval dernier=$3 (s'il y avait par exemple 3 paramtres de position) car le shell eectue la substitution de variable ($#). 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). L'aectation est ensuite excute et on obtient bien ce que l'on voulait. exec commande la commande est excute la place du shell sans cration de nouveau shell. On a vu en 16.4.2 que exec permet aussi de faire des redirections dnitives dans le shell. wait n] attend le processus ls de pid n. Si n n'est pas spci, attend tous les processus ls. 17.7. RCURSIVIT DANS L'EXCUTION DES SHELLSCRIPTS 13 Cette commande permet de lancer des processus en arrire-plan et d'en attendre certain avant de continuer une action. Il peut tre utile de conserver le pid d'un processus lanc en arrire-plan dans une variable l'aide de la variable spciale $! (voir 15.2.6). 17.7 Rcursivit dans l'excution des shellscripts Un shellscript (ou une fonction) peut s'appeler lui-mme. Par exemple le shellscrip dirr suivant ache tous les sous-rpertoires de l'arborescence d'un rpertoire donn e paramtre en dcalant les dirents niveaux de sous-rpertoires : dir=${1-.} indent=$2 for fich in `ls -A $dir` do if -d $dir/$fich ]# then echo "$indent"$fich $0 $dir/$fich "$indent " fi done Remarques 17.7 (a) L'utilisation de $0 au lieu du nom du shellscript assure que le shellscript fonctionner mme si on change son nom. (b) L'excution de ce shellscript risque de provoquer une erreur si l'arborescence d rpertoire est profonde et si la mmoire alloue la pile est trop faible. 17.8 Calculs, traitement des chanes de caractres ksh et zsh fournissent la commande interne let pour eectuer des calculs arithmtique Cette commande n'existe pas dans sh mais on peut utiliser la commande expr. expr permet aussi d'extraire des sous-cha nes d'une cha ne de caractres. 17.8.1 Commande expr expr arguments... value les arguments comme une expression. Le rsultat est envoy sur la sortie standard Ce n'est pas une commande interne au shell mais elle est trs utile dans l'criture d shellscripts Attention, sauf pour les options ci-dessous o- le code retour est indiqu, le code retou renvoy est 0 lorsque la valeur envoye sur la sortie standard est dirente de 0 et 1 si l valeur est 0. Les calculs se font sur des entiers cods sur 32 bits en complment 2. CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 136 arguments est une expression comprenant des oprateurs. On peut utiliser les oprateurs 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 < > * & |). Voici ces oprateurs par ordre de priorit croissante, regroups par groupes d'gales priorits : 17.8. CALCULS, TRAITEMENT DES CHANES DE CARACTRES (b) Le programme suivant ache les nombres entiers de 1 9 : a=1 while $a -lt 10 ] do echo $a a=`expr $a + 1` done exp1 n j exp2 si exp1 est non nulle et non vide, elle est envoye sur la sortie standard, sinon si exp2 est non nulle et non vide, elle est envoye sur la sortie standard, sinon 0 est envoye sur la sortie standard. exp1 n& exp2 (c) expr "$a" : ".*" exp1 op_comp exp2 (d) expr 123abc : '0-9]*' si exp1 et exp2 sont non nulles et non vides, exp1 est envoye sur la sortie standard, sinon 0 est envoye sur la sortie standard. o- op_comp est un oprateur de comparaison : < <= = != >= > La comparaison est numrique si les deux expressions sont numriques * elle est lexicographique sinon. Envoie 1 sur la sortie standard si l'expression est vrai et 0 sinon. exp1 + exp2 exp1 - exp2 addition et soustraction exp1 n* exp2 exp1 / exp2 exp1 n% exp2 multiplication, division et modulo Autres arguments : (une seule cha ne de caractre) envoie chane sur la sortie standard et le code retour 0 si chane est non vide * envoie une ligne vide et le code retour 1 si chane est vide. chane chane : exp-reg renvoie le nombre de caractres de chane qui peuvent tre dsigns par 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 ^. Si une partie de l'expression rgulire est parenthse par \( et \), expr renvoie la sous-cha ne de chane qui correspond cette partie. Le code retour 1 est renvoy si l'expression rgulire exp-reg ne correspond aucune sous-cha ne de chane et 0 sinon. On peut regrouper les expressions en les parenthsant par ( et ). Exemples 17.13 (a) a=`expr $a + 1` incrmente a de 1. 13 ache le nombre de caractres de la cha ne contenue dans la variable a. ache 3. (e) Le shellscript option suivant ache le nombre n associ une option -n. Il renvoi le code retour 1 si le paramtre ne commence pas par le caractre - : expr $1 : '-\(.*\)' 17.8.2 Commande let Cette commande n'existe pas en sh. Elle est disponible dans ksh et zsh. let expression arithmtique permet d'aecter des valeurs numriques une variable. L'expression arithmtique doit tre un seul mot pour le shell (on peut l'entourer d guillemets pour cela). Il ne faut pas faire prcder les noms des variables du shell par signe $ pour dsigner leur contenu. Exemples 17.14 (a) let a=10+b (b) let "a = 10 * a" ((expression arithmtique)) est quivalent let "expression arithmtique" (voir 14.8) Exemples 17.15 (a) ((a=10+b)) (b) ((a = 10 * a)) Pour des calculs plus complexes on utilisera la commande bc . 138 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS 17.9 Traitement des chanes de caractres Le langage Perl permet d'eectuer de nombreuses manipulations sur les cha nes de caractres. Le langage est complexe et n'est pas tudi dans ce cours. Son usage doit tre envisag pour les programmes qui comportent beaucoup de traitements de cha nes de caractres. Il est en particulier trs utilis dans les programmes CGI (Common Gateway Interface ) installs sur les serveurs Web (voir cours polycopis sur les rseaux). La commande habituelle utilise pour la manipulation de cha nes de caractres est la commande expr (voir 17.8.1). Voici des mthodes (plus ou moins) simples pour extraire une sous-cha ne de caractres. Pour ces exemples, on extrait l'heure les minutes et les secondes en utilisant la commande date et la substitution de commande (voir 14.7) : heure=`date | cut -c12-19` heure=`date | awk '{print $4}'` heure=`date | read a b c d e# echo $d` heure=`date | sed 's/^ ]* ^ ]* ^ ]* \(^ ]*\).*/\1/'` heure=`set \`date\` # echo $4` heure=`expr "\`date\`" : '^ ]* ^ ]* ^ ]* \(^ ]*\)'` IFS On peut aussi utiliser la variable . Voici des lignes de programme pour acher le nom de la machine d'une adresse internet : nom=samoa.unice.fr IFS=. set $nom echo $1 17.10 Aide pour traiter les options (getopts) La commande getopts est une commande interne qui aide rcuprer les valeurs des paramtres de position des shellscripts dont la syntaxe suit la syntaxe habituelle des commandes Unix. On sait que les commandes Unix acceptent plusieurs formats dirents. On peut crire par exemple ls -la ou ls -l -a. Quand une option ncessite un complment, ce complment peut tre accol l'option ou spar de l'option par un espace ( -P1rv ou -P 1rv par exemple). La rcupration des options d'un shellscript ncessite donc un traitement assez complexe. La commande getopts facilite grandement la t&che du programmeur. 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...] 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 17.11. MISE AU POINT DES SHELLSCRIPTS (SET -XV) 13 met dans la variable du shell nom-variable la prochaine option et le numro de prochai argument traiter dans la variable OPTIND. La premire fois que getopts est appele, OPTIND vaut 1 et ensuite OPTIND est incrment chaque fois que l'on appelle getopts, au fur et mesure du traitement des dirent paramtres. Si une des options ncessite un argument (comme l'option -P voque c dessus), cet argument est rang dans la variable OPTARG. Si une option illgale est rencontre, nom-variable re'oit la valeur ?. Quand toutes les options ont t passes en revue, getopts renvoie un code retour no nul. L'option spciale -- peut indiquer la n des options (on peut ainsi indiquer u argument qui n'est pas une option et qui commence par -). Les options acceptes sont indiques dans la cha ne options. Le caractre : est acco derrire les options qui doivent tre suivies d'un complment. Voici un exemple d'utilisation de getopt en dbut de shellscript. Ce shellscript est sup pos accepter les options simples -a et -b et les options -s et -f avec des complments. O notera que l'on analyse d'abord tous les paramtres avant de commencer les traitement On n'est ainsi pas tributaire de l'ordre dans lequel l'utilisateur a donn les paramtres su la ligne de commande. opta=0# optb=0# optf=0# opts=0 fichier= # complement pour option -f sujet= # complement pour option -s while getopts abs:f: argument do case $argument in a) opta=1 ## b) ooptb=1 ## f) optf=1 fichier="$OPTARG"## s) opts=1 sujet="$OPTARG"## \?) echo "`basename $0`: Usage: \ `basename $0` -ab] -s sujet] -f fichier-adresses message]" >& exit 2## esac done shift `expr $OPTIND - 1` if $optf -eq 0 ] # then ... 17.11 Mise au point des shellscripts (set -xv) set -v 140 CHAPITRE 17. PROGRAMMATION DES SHELLSCRIPTS fait acher les lignes du shellscript au moment o- elles sont lues par le shell. set cette option. set -x +v annule fait acher les commandes (et leurs arguments) au moment de leur excution, aprs l'interprtation du shell. set +x annule cette option. Ces commandes peuvent tre insres de part et d'autre des lignes que l'on veut suivre 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 vite de modier le shellscript) est de lancer le shellscript par (on remplacera sh par zsh si le shellscript doit tre excut par zsh ). sh -x nom-shellscript ou sh -v nom-shellscript Index #, 32 #!, 101 .zshenv, 111 .zshrc, 111 :, 118, 134 #, 113 <, 94 <&n, 117 <<, 115 =, 105 >, 93 >!, 94 >&n, 117 >>, 94 ?, 31, 59 , 31, 59 (test), 123 ... ]], 124 n, 31, 58, 99 , 99 n(...n), 60 %n, 97 nn, 60 n{m, n}, 60 n{m,nn}, 60 n{mn}, 60 ^, 31 ^, 58 `, 98 {...}, 96 j, 61, 95 jj, 113 , 31 a2ps, 48 administrateur, 11 aectation, 105 acher, 108 , 58 $ $!, 108 $#, 108 $$, 108 $(...), 98 $*, 108 $?, 108 $@, 108 $n, 104 $variable, 105 ${#variable}, 119 ${=variable}, 106 ${variable##modle}, 119 ${variable#modle}, 119 ${variable+mot}, 118 ${variable-mot}, 118 ${variable=mot}, 118 , 118 ${variable?mot} ${variable%%modle}, 120 ${variable%modle}, 119 ${variable}, 106 &, 96, 113 &&, 113 ', 99 ((...)), 137 (...), 95 *, 30, 59 +, 59 ., 58, 102 .plan, 38 .project, 38 .zlogin, 111 .zprole, 111 141 INDEX 142 acher le contenu d'un chier, 44 acher les octets d'un chier, 45 acher page page, 45 alias, 97 appels systme, 5 arrire-plan, 13, 96 at, 43, 96 autorisations, 35, 36 autorisations d'un chier, 15 awk, 81 batch, 96 bc, 137 bg, 97 boucles rediriges, 131 Bourne shell, 6 break, 131 C-shell, 6 calculs, 135 calculs mathmatiques, 137 cancel, 47 caractres spciaux pour le shell, 30 case, 128 cat, 44 cd, 30 CDPATH, 107 CGI, 138 cha ne de caractres, 135, 138 chmod, 35 cmp, 78 code retour, 78, 93, 125 comm, 88 commande externe, 6 commande interne, 6, 92, 134 commentaire, 32 comparer deux chiers, 78 compatibilit de zsh, 92 compltion des commandes, 24 compress, 54 compter les caractres, mots et lignes, 74 concatner plusieurs chiers, 44 congurer zsh, 92 continue, 131 convertir des caractres, 75 copier des chiers, 50 copier l'arborescence d'un rpertoire, 56 core, 13, 34 cp, 50, 56 cpio, 57 crer un rpertoire, 55 csh, 6 csplit, 88 cut, 76 daemon, 13 date, 37 dbut d'un chier, 79 dcaler les paramtres, 125 demand paging, 12 dmon, 13 dpersonnaliser, 99 dplacer des chiers, 53 descripteur de chier, 116 df, 39 di%, 78 dirences entre deux chiers, 78 DISPLAY, 112 disquette, 53 driver, 5, 29 droits sur un chier, 16 du, 39 echo, 108 ed, 115 diteur de texte, 62 eject, 53 emacs, 62 EMACSLOADPATH, 63 entre standard, 93 environnement, 11, 92, 104, 109, 110, 119 Envoyer un chier, 48 erreur standard, 93 eval, 134 excution d'un shellscript, 100 exec, 116, 134 INDEX 14 exit, 19, 125, 131 export, 109 expr, 135 interprtation du shell, 99 interprteur de commandes, 5 false, 113 fg, 97 Korn-shell, 6 ksh, 6 expression conditionnelle, 124 expression rgulire, 58 extraire une sous-cha ne, 135 chier type de, 7, 29 chier inclus, 115 chier ordinaire, 7 chier spcial, 8, 29 le, 32 n d'un chier, 79 nd, 32 nger, 38 fold, 88 fonction, 114 for, 128 gnration des noms de chiers, 30 gestion des jobs, 97 getopt, 138 getopts, 138 grep, 74 groupe d'un chier, 15 groupe d'un processus, 13 groupe d'utilisateurs, 9 gzip, 54 head, 79 historique de Unix, 3 HOME, 30, 106 hostname, 37 i-node, 8, 14, 51 identicateur d'une variable, 105 if, 125 IFS, 107 imprimantes disponibles, 46 imprimer, 45 inhiber l'interprtation du shell, 99 jobs, 97 join, 88 kill, 22, 42 lancer une commande, 22 last, 38 lecteur de disquettes, 53 lecture ligne ligne d'un chier, 131 let, 137 lien, 30, 52 lien hard, 51 lien symbolique, 52 lien symbolique pour un rpertoire, 56 lignes conscutives distinctes, 79 lignes conscutives identiques, 79 liste de commandes, 113 ln, 52, 56 locate, 34 lpq, 47 lpr, 46 lprm, 47 lpstat, 46 ls, 27 mail, 48 majeur, 29 man, 21 mcopy, 53 mdir, 53 message d'erreur, 94 mineur, 29 mise au point, 139 mise en page, 48 mkdir, 55 mode dired d'emacs, 68 mode d'accs un chier, 15 modier la valeur d'une variable, 120 monter un systme de chiers, 6 INDEX 144 more, 45 mot de passe, 18 mv, 53, 55 NFS, 7 NIS, 18, 38 NOCLOBBER, 94 nohup, 96 nom absolu, 22 nom d'un chier, 22 nom d'une commande, 22 nom de l'ordinateur, 37 nom relatif, 22 noyau, 5 NULLCMD, 118 numro de job, 96 numro de processus, 11 od, 45 options traitement, 138 options des shells, 92, 110 ordre de priorit, 114 OSF, 4 paramtre, 104 partition d'un disque, 6 passwd, 18 paste, 88 PATH, 22, 100, 107 PC (compatible), 53 Perl, 82 pid, 11, 96 pilote, 29 pipe, 95 pipe nomm, 8 place libre d'un systme de chiers, 39 place occupe par un rpertoire, 39 pliage de rpertoires, 57 Postscript, 48 pr, 48 primitive, 5 print, 108 \subitem printcap, 46 printenv, 110 PRINTER, 46 processus, 11 image, 11 processus en cours d'excution, 41 programme de dmarrage, 10 prompt, 92 propritaire d'un chier, 15 propritaire eectif, 13 propritaire rel, 13 protection des chiers, 15 ps, 41 PS1, 107, 120 PS2, 107 pseudo-chier, 95 pwd, 30 racine, 22 read, 108 recherche d'une cha ne, 74 recherche d'une commande, 100 recherche de chiers, 32 rechercher le manuel en ligne, 23 rechercher une commande, 23 rcursivit, 135 redirection, 44, 93, 115, 116 redirection des erreurs, 94 redirection sur chier inclus, 115 regrouper des commandes, 95 renommer des chiers, 53 renommmer un rpertoire, 55 rpertoire structure interne, 14 rpertoire courant, 12 rpertoire HOME, 10 requte d'impression, 46 return, 115 rm, 52, 55 rmdir, 55 sauvegarder sur disquette, 53 sed, 80 set, 91, 104, 110, 139 INDEX set group id, 16 set user id, 16 setopt, 110 sgid, 16 sh, 6 shell, 5, 91 shell d'excution d'un shellscript, 101 shellscript, 6, 91, 100 shift, 125 signal, 12, 42, 132 sleep, 130 socket, 8 Solaris, 4 sort, 73 sortie standard, 93 split, 88 spool, 46 substitution de commande, 98 suid, 16 super-utilisateur, 11 supprimer des caractres, 75 supprimer des chiers, 52 supprimer des rpertoires, 55 supprimer des requtes d'impression, 47 supprimer un processus, 22, 42 supprimer une variable, 106 suspendre un processus, 97 swap, 12 systme d'exploitation, 3 nom du, 37 systme d'impression, 46 systme de chiers, 6 tail, 79 tar, 57 TERM, 107, 112 terminal de contrle, 13 test, 123 thread, 11 touche spciale, 19 tr, 75 traiter les options, 138 trap, 132 14 tri, 73 true, 113 tty, 39 type d'un chier, 32 type de chier, 29 uid, 9 umask, 36 unalias, 97 uname, 37 uniq, 79 Unix BSD, 4 Unix OSF, 4 Unix Systme V, 4 unset, 106 until, 131 uuencode, 48 valeur par dfaut d'une variable, 118 vared, 120 variable, 118 dcomposition en mots sous zsh, 106 valeur par dfaut, 118 variable de position, 104 variable du shell, 105 variable spciale du shell, 106 wait, 134 wc, 74 whence, 23 whereis, 23 while, 130 who, 37 whoami, 37 write, 113 xemacs, 62 xterm, 103 Yellow Pages, 38 ypcat, 38 yppasswd, 18 Z shell, 6 zip, 54 146 zone de swap, 12 zsh, 6, 92 INDEX