Professional Documents
Culture Documents
Septembre 2006
Environnement Unix
Support de cours Unix laborer par: Dr. Maher SALLAMI Modifier par: Dr. Montaceur ZAGHDOUD (2005) Rviser par: Salem BELHAJ (2006)
SOMMAIRE
Chapitre 1 : Prsentation Gnrale du Systme Unix ................................................................ 4 1.1 Introduction ...................................................................................................................... 4 1.2 Caractristiques dUNIX.................................................................................................. 5 1.3 Architecture dUNIX........................................................................................................ 5 1.3 Le noyau........................................................................................................................... 6 1.4 Le langage shell................................................................................................................ 6 1.5 Les commandes ................................................................................................................ 7 1.6 Les entres-sorties et leur redirection............................................................................... 7 1.7 Notions de processus........................................................................................................ 7 1.8 La gestion des fichiers...................................................................................................... 8 1.9 Les droits d'accs aux fichiers et rpertoires.................................................................... 9 1.10 Procdure de connexion Unix ...................................................................................... 10 1.11 Quelques Commandes Unix......................................................................................... 11 Chapitre 2 : Commande de Base du Systme Unix ................................................................. 12 Chapitre 3 : Programmation Shell............................................................................................ 27 1 Introduction ...................................................................................................................... 27 2 Les caractres gnriques................................................................................................. 27 3 Cration de script, fonction du shell.................................................................................. 27 4 Paramtre des fichiers scripts............................................................................................ 28 5 Cration des variables ....................................................................................................... 28 5.1 Cration des variables ................................................................................................... 29 5.2 Les variables systmes ................................................................................................... 29 6 Lenvironnement d'un SHELL .......................................................................................... 29 7 Structure de contrle ......................................................................................................... 29 8 Aritmtique entire et logique........................................................................................... 32 9 Redirection ........................................................................................................................ 32 10 Les signaux...................................................................................................................... 32 11 Le Korn Shell (K-Shell) .................................................................................................. 32 Chapitre 4 : Les Filtres ............................................................................................................. 37 4.1 Filtres.............................................................................................................................. 37 4.1.1 Les mtacaractres ...................................................................................................... 38 4.1.1.1 Le mtacaractre ............................................................................................... 38 4.1.1.2 Les mtacaractres [ ] ........................................................................................ 38 4.1.1.3 Les mtacaractres ^ et $ ................................................................................ 39 4.1.1.4 Le mtacaractre *............................................................................................. 39 4.1.1.5 Les mtacaractres \( \) ........................................................................................ 39 4.1.2 Les expressions rgulires........................................................................................... 39 4.1.3 La commande tail ........................................................................................................ 40 4.1.4 La commande head...................................................................................................... 41 4.1.5 La commande tee ........................................................................................................ 41 4.1.6 La commande sort ....................................................................................................... 41 4.1.7 La commande tr........................................................................................................... 42 4.1.8 La commande find....................................................................................................... 43 4.1.9 La commande grep ...................................................................................................... 45 4.1.10 Les commandes cat et less ........................................................................................ 47 4.1.11 La commande cut: slection de colonnes.................................................................. 48 4.1.12 La commande wc ...................................................................................................... 48
2 /84
4.1.13 La commande tr......................................................................................................... 48 4.1.14 Lutlitaire sed ............................................................................................................ 49 4.1.15 L'utilitaire awk........................................................................................................... 54 4.2 La redirection ................................................................................................................. 59 4.2.1 Les pipes.................................................................................................................. 59 4.2.2 L'aiguillage (tee)...................................................................................................... 60 Chapitre 5: Programmation du Noyau Unix ............................................................................ 62 5.1 Le noyau Unix................................................................................................................ 62 5.2 La gestion des fichiers et les entres/sorties de base...................................................... 62 5.2.1 Les i-noeuds ............................................................................................................ 62 5.2.2 Les systmes de fichiers.......................................................................................... 64 5.2.3 Descripteurs des fichiers ......................................................................................... 65 5.2.4 Les E/S sur fichier ................................................................................................... 66 5. 3 Les rpertoires ............................................................................................................... 66 5.4 Les signaux sous UNIX.................................................................................................. 68 5.4.1 Prsentation des signaux ......................................................................................... 68 5.4.2 L'envoi de signaux................................................................................................... 68 5.4.3 Le traitement des signaux........................................................................................ 69 5.4.4 La primitive alarm................................................................................................... 70 5.5 Les Processus ................................................................................................................. 70 5.5.1 Les tats d'un processus........................................................................................... 71 5.5.2 Priorit d'un processus............................................................................................. 72 5.6 La cration de processus ................................................................................................ 73 5.7 Synchronisation du pre et du fils .................................................................................. 75 5.8 Les tubes......................................................................................................................... 75 5.8.1 Introduction ............................................................................................................. 75 5.8.2 Les piles FIFO (First In First Out) ou pipes nomms ............................................. 77 5.8.3 Les vnements ....................................................................................................... 77 5.9 Solutions des exercices................................................................................................... 77 ANNEXE: Les variables Unix ................................................................................................. 81 Mta-caractres d'expansion ................................................................................................ 81 Variables d'environnement prdfinies ................................................................................ 81 Variables de substitution prdfinies ................................................................................... 82 Variables utilisateur.............................................................................................................. 82 Fichiers d'initialisation ......................................................................................................... 82 /etc/profile (sous System V uniquement) ............................................................................. 83 .profile .................................................................................................................................. 83 .zshrc, .bashrc (en zsh ou bash)............................................................................................ 84 .login, .cshrc, .tcshrc, .logout (en csh ou tcsh) ..................................................................... 84
3 /84
Figure 1.1 : Arborescence des versions du systme Unix 1983 t marque par l'apparition de UNIX system V, un systme Unix commercialis par AT&T. De son ct l'Universit de Californie met au point une variante du systme ENSI/ Environnement Unix/ Septembre 2006 4 /84
destine aux systmes VAX nomme UNIX BSD. Les deux systmes se sont concurrencs pour longtemps fait la guerre et c'est le system V qui en est sorti vainqueur. De nos jours les systmes Unix restent trs prsents dans les milieux professionnels et de l'ducation grce sa grande stabilit et son utilisation en rseau. Une nouvelle version Open Source d'Unix a t dveloppe pour les PCs (Personal Computers) par le Finlandais Linus Torvalds et s'appelle Linux.
5 /84
1.3 Le noyau
Le noyau d'Unix gre les tches de base du systme: l'initialisation; la gestion des processus systme; la gestion des processus utilisateurs; la gestion du processeur et de la RAM; la gestion des systmes de fichiers. Le partage du temps processeur entre les processus actifs est gr par le processus systme appel 'scheduler' et il est bas sur l'horloge de l'ordinateur. des intervalles rguliers (de l'ordre d'un centime de seconde), le processeur abandonne l'excution du processus courant et passe l'excution du premier processus de plus haute priorit en attente. Pour accomplir les tches qui lui sont propres, le noyau accde un groupe de tables, dites systme, qui concernent les processus actifs, les fichiers ouverts, le super bloc (voir gestion des fichiers), les buffers d'entres-sorties, etc. chaque intervalle, un examen de la table des processus permet au noyau de dterminer lequel doit tre excut; les donnes propres chaque processus actifs (environnement de variables, tat des registres, ...) sont prsentes dans une zone mmoire rserve du noyau. Avant l'excution du processus slectionn, le noyau passe la main au 'swapper', le processus systme qui gre les ressources mmoire et procde si ncessaire des changes entre la RAM et le disque dur. Ensuite, le processus est enclench (tat Actif).
e) il se charge de raliser les redirections des entres-sorties, les pipes et la substitution de type fichier (dtaills plus loin dans ce cours).
O:
commande est le nom d'une commande interne ou un programme excutable, et arguments sont des options reconnues par cette commande.
endormi (en attente) ->S (leeping); invalide (en attente de mmoire) ->X (SXBRK); cr (tat transitoire, processus en cours de cration) ->I (dle); zombie (lexcution du processus est termine, mais ses lments restent visibles) ->Z(ombie); arrt (processus mis en attente par lutilisateur) ->T (raced). La liste de tous les processus avec leurs tats peut tre affiche avec:
commande ps el
Lorsquun processus est actif, il a le contrle du processeur et de lunit centrale; lorsquil change dtat, le systme utilise un mcanisme de swapping et crit limage du processus sur le disque dur (dans une zone rserve !).
8 /84
9 /84
10 /84
imprime le fichier demand print change l'attribut d'un fichier chmod XXX fichier XXX= Utilisateur|Groupe|Autres ou X reprsente un chmod entier 1<X<7 Lecture=1, Ecriture=2, Execution=4 X=Lecture+Ecriture+Execution change les informations personnelles vues avec finger chfn change le shell : chsh user emplacement_du_shell chsh liste des utilisateurs en ligne finger trace le chemin entre la machine locale et la machine vise Tracert traceroute transfert de fichier entre la machine locale et la machine ftp [machine] cible [port] rcupre un fichier get envoie un fichier put quitte la session FTP quit telnet [machine] effectue un telnet permet de parler un utilisateur connect talk talk user autorise ou non la commande talk mesg n : Empeche la reception de messages talk mesg mesg y : Permet la reception de messages talk dconnexion bye Tableau 1.3: Commandes Unix
11 /84
Il est important de remarquer qu'un espace spare chacun des paramtres et les paramtres de la commande elle-mme. On remarquera galement que certains paramtres peuvent commencer par un tiret, not -. En gnral, ces paramtres spciaux (options) sont spcifier comme premier paramtre. Quelques-unes des commandes disponibles seront expliques, dans leurs aspects les plus simples. Pour une aide plus complte, utilisez la commande man, comme expliqu ciaprs (voir section commande_man).
Ce script utilise le concept de sparateurs de awk . NF reprsente le nombre de champs (anglais: field number). Le caractre $ prcde toute expansion de variable (comme dans un shell ). Notez la prsence d'apostrophes afin d'viter l'expansion des variables directement par le shell. bg, processus en arrire plan bg PID, met le processus de numro PID en arrire plan. ENSI/ Environnement Unix/ Septembre 2006 12 /84
Cal, calendrier
Cal [mois] [anne]
revenir la racine.
cd
autorise les gens de votre groupe crire dans bin. Si bin est un rpertoire, l'accs en cration et effacement de fichiers est autoris.
chmod o+x bin
autorise n'importe qui entrer dans le rpertoire bin, ou excuter bin si bin est un fichier. Notez que la cration de rpertoires ou de fichiers se fait avec un mode par dfaut qui dpend de la commande umask (voir section conf_comm). Le paramtre de mode de la commande chmod peut tre galement exprim sous forme absolue en numrique, en exprimant les protections utilisateur, groupe et autres de gauche droite par trois valeurs de 0 7. Sachant que l'excution, l'criture et la lecture sont symbolises respectivement par les valeurs 1, 2 et 4, on a, par exemple: ENSI/ Environnement Unix/ Septembre 2006 13 /84
comme 6 = 2 + 4, on autorise l'accs en criture et en lecture pour nous et notre groupe, tandis que seule la lecture est possible pour les autres utilisateurs qui ne sont pas membres du groupe. compress, uncompress, gzip, gunzip, zip, unzip, unarj, compression et dcompression d'un fichier Ces commandes permettent la compression de fichiers textuels ou binaires, ainsi que la dcompression d'archives. Toutes ces commandes s'utilisent de la mme faon, elles diffrent seulement par le type de compression. La syntaxe gnrale est
Compression fichier uncompression fichier.xxx
avec xxx l'extension dpendant du type de compression utilise : Z compression avec compress. tait utilis sur les systme UNIX, est remplacer maintenant pas gzip qui est plus preformant et sans droit. gz compression avec gzip (GNU Zip). Le logiciel de compression le plus utilis sous UNIX : zip compression avec zip. Utilis principalement dans le monde DOS ou Windows. arj compression avec arj. Aussi utilis dans le monde DOS ou Windows. Ainsi on a pour gzip :
gzip fichier
compresse fichier en fichier.gz gunzip fichier.gz dcompression du fichier.gz en fichier Notez que, dans ce cas, on peut aussi spcifier gzip -d fichier.gz pour dcompresser un fichier.
14 /84
Une commande similaire, beaucoup plus simple utiliser, et qui permet cette fois de retarder l'excution de travaux (par exemple pendant la nuit ou le week-end) est la commande at:
t now + 5 min < fichier_commande
Notez les guillemets qui empchent une interprtation de la regexp par le shell.
15 /84
Cette commande est trs puissante. On peut lui faire rechercher des fichiers en fonction d'un utilisateur ou d'un groupe particulier, en connaissant une partie du nom, en fonction de sa taille, de sa date de cration ou de dernire modification ou de son mode (les protections UNIX, voir chmod). On peut galement excuter une commande (ce qui sera souvent peu rapide mais fort utile) sur les fichiers trouvs. Voici un exemple un peu plus complexe qui recherche depuis la racine tous les fichiers
core appartenant l'utilisateur schaefer et qui sont plus gros que 500 kilo-octets ou modifis il y a plus de 7 jours, sauf s'ils appartiennent au groupe keep. Les fichiers trouvs
sont automatiquement effacs. Notez l'usage des parenthses (prcdes d'un backslash pour viter leur interprtation par le shell). Remarquez galement la notation utilise pour le ou et le fait que la conditionnelle et s'exprime par simple juxtaposition. Enfin admirez la syntaxe trs particulire de l'excution d'une commande.
find / -name 'core' -user schaefer \( -size +500k -o -mtime +7 \) \! -group keep -exec rm {} \;
Il existe plusieurs variantes cette commande, dont egrep, qui permet de spcifier des conditions plus gnrales. L'option -i permet d'ignorer la casse, ce qui est parfois bien pratique.
16 /84
Un aspect intressant de cette commande est la possibilit de dtruire un groupe de processus. Par exemple, pour dtruire tous les processus vous appartenant, sauf le shell courant, il suffit de donner les commandes suivantes:
kill -15 -1
Force la destruction de tous vos processus. ln, lien symbolique vers un fichier
ln fichier1 fichier2
Files cours1.ps
et de retirer le document de la file d'attente de l'imprimante l'aide de la commande lprm: $lprm 343 aldebaran: lphp-343 dequeued L'option -p est utiliser pour retirer un document d'une autre imprimante que de l'imprimante par dfaut.
Des variantes libres de cette commande existent, parmi elles citons pstops et psnup. ENSI/ Environnement Unix/ Septembre 2006 17 /84
lister tous les fichiers de faon complte avec les modes, les groupes, les crateurs et les dates, ainsi que les fichiers spciaux commenant par . et faire afficher par la commande more . Il s'agit d'un exemple d'utilisation des pipes.
ls -F
lister les fichiers avec des indications de type de fichier (fichier, rpertoire/, lien@, excutable*). Mesg, viter ou rtablir la communication mesg n: permet dviter la rception des messages mesg y: permet de rtablir la communication.
mount, montage dun systme de fichiers La commande mount permet dattacher un systme de fichier un point de montage de larborescence du systme Unix (par exemle, un lecteur de disquette ou de CD).
nice commande
Pour voir le niveau de priorit d'un processus ainsi que son niveau de ``gentillesse'', on peut utiliser la commande ps -l. Plus la valeur est importante, moins la priorit est forte. La commande renice permet de diminuer la priorit d'un processus actif (vous appartenant). Augmenter la priorit n'est en gnral possible que pour root.
19 /84
cration de nouveaux fichiers ou d'extension de fichiers existants se soldera par un chec. Ce message peut galement s'afficher au cours d'une session.
rlogin machine rlogin machine (remote login) : sert se loguer distance. On peut donner directement son nom de login avec l'option -l (login). Par exemple :
rlogin bireme.ens.fr -l toto
La fentre o Toto a lanc son rlogin sera connecte l'ENS, sur la machine bireme (sise en salle S), et le mot de passe sera demand. La connexion depuis les Macs se fait sur ce principe (mais le programme s'appelle telnet). Dans tous les cas, pour se dloguer: taper exit. Le rlogin ne sert pas seulement se connecter distance. Si il n'y a plus aucune machine disponible l'cole et que vous devez absolument lire votre courrier, par exemple, vous pouvez demander quelqu'un de vous prter une fentre; le nom de la machine sera alors celui de la machine sur laquelle vous vous trouvez, sans en prciser davantage l'adresse. Par exemple, il n'y a plus de station libre en Infi, et Toto demande la personne qui travaille sur aviso de lui prter une fentre. Il tape donc sans avoir besoin de taper le password:
rlogin aviso -l toto
permet de dtruire tous les fichiers indiqus avec confirmation pour chacun. On appelle cela le mode interactif de rm. Certains ajoutent un alias dans leur .cshrc afin de remplacer rm par rm -i. Cela peut parfois s'avrer plus dangereux qu'utile: le risque est grand alors de prendre l'habitude de confirmer sans vraiment lire. Une erreur ne pas faire est de mettre l'option -i ailleurs qu'au dbut de la commande: le systme n'en tiendrait pas compte et dtruirait sans confirmation.
rm -r rpertoire1 ... rpertoiren
permet de supprimer rcursivement une arborescence (rpertoires, sous-rpertoires et fichiers). Inutile d'insister sur le danger d'une telle commande. Il faut donc noter que par dfaut, la commande rm ne demande aucune confirmation. Les fichiers sont donc irrmdiablement perdus, moins que le fichier ait t cr le jour prcdent, au moins, dans ce cas, il existe sur les copies automatiques journalires de scurit (vrifiez cependant avec votre administrateur systme si des copies de vos donnes sont effectues rgulirement). Il faut noter que vouloir rcuprer un fichier pralablement effac l'aide des structures de rpertoires est une opration la plupart du temps voue l'chec, en particulier sous UNIX en raison du caractre multi-utilisateur et de la cration frquente de fichiers. Selon les caractres prsents dans le nom de fichier, il peut tre ncessaire d'utiliser le /ou la compltion de la ligne de commande. Si le premier caractre du nom de fichier est -, utilisez : rm ./-nom.
20 /84
21 /84
Ce script demande de remplacer les occurences de points par des barres obliques (anglais: slash). Les pourcents sont des caractres dlimiteurs qui peuvent tre quelconques tant qu'ils ne figurent pas ni dans le motif ni dans la chane remplaante.
archive tous les fichier du rpertoire courant et de ses sous-rpertoires, compresse cette archive avec gzip (l'argument -9 slectionne la meilleure (mais plus lente) compression) et stocke le rsultat dans truc.tar.gz. La version GNU de cette commande permet de simplifier en tar cvfz truc.tar.gz, sans toutefois pouvoir spcifier la force de la compression. tar tvf truc.tar : liste le contenu d'un fichier tar truc.tar.
gzip -d < truc.tar.gz | tar oxvf -
extrait le contenu d'un fichier tar compress avec gzip . De nouveau, la version GNU est plus puissante et incorpore ce mcanisme: tar oxvfz truc.tar.gz.
22 /84
Note: le - dans la commande tar dsigne la sortie ou l'entre standard au lieu d'un fichier. Il faut aussi signaler qu'une commande similaire, parfois plus puissante pour certaines applications, est cpio. Notez toutefois que son utilisation est lgrement plus complexe.
Grce cette commande, on peut envoyer des fichiers binaires par courrier lectronique (voir section encoding_mail). Ils sont reconnaissables trs facilement par leur entte begin 644 nom_de_fichier. On les dcode l'aide de uudecode.
uuencode < fichier fichier > fichier.uu cre le fichier uuencod fichier.uu qui pourra tre transmis par mail. uudecode fichier.uu
dcode le fichier uuencod aprs rception et sauvegarde le rsultat dans le fichier spcifi dans fichier.uu en paramtre de la ligne begin.
permet dafficher le chemin ou lemplacement dune commande ou aussi dun fichier excutable write envoi de message La commande write permet denvoyer un message un entre utilisateur Unix. Monter et dmonter un systme de fichiers La commande mount permet de monter un systme de fichiers (partition, lecteur de disquette ou de cdrom, second disque dur...). On peut alors accder aux fichiers contenus dans ce systme de fichiers. La commande mount -a permet de monter tous les systmes de fichiers dclars dans le fichier /etc/fstab. Voici un exemple de fichier /etc/fstab :
/dev/hda3 /dev/hda2 /dev/hda6 /dev/hda5 /dev/hda1 / swap /usr /home /Dos/C ext2 swap ext2 ext2 vfat defaults defaults defaults defaults defaults 1 0 1 1 0 1 0 2 2 0
23 /84
/dev/hdb none
/cdrom /proc
iso9660 proc
ro,noauto,user 0 defaults 0
0 0
L'ordre des champs dans ce fichier est le suivant : priphrique point de montage type options L'option user permet tous les utilisateurs de monter un priphrique (un lecteur de CD-ROM, par exemple). La syntaxe de la commande mount est la suivante :
mount -t type_priphrique point_de_montage
Le tableau suivant prsente les principaux types de systmes de fichiers utiliss. Type ext2 Utilisation Le plus courant sous Linux. Dstin la plupart des CD-ROM. Systmes de fichiers virtuels, qui donne des informations sur le noyau (utilis par ps, par exemple).
Tableau 2.1: Principaux types de systmes de fichiers utiliss sous Linux Le priphrique est situ en gnral dans le rpertoire /dev. Le point de montage est le rpertoire o le systme de fichiers doit tre intgr. Voici quelque exemples de montages ou de dmontage de systmes de fichiers : Montage d'une partition Dos :
mount -t vfat /dev/hda1 /Dos/C/
ou
mount /dev/hda1 /Dos/C/
Pour convertir automatiquement les fins de lignes des fichiers ASCII MS-DOS au format UNIX, utiliser l'option conv:
mount -o conv=auto -t vfat /dev/hda1 /Dos/C/
Dmontage d'une partition Dos (les systmes de fichiers ne doivent pas tre en cours d'utilisation):
umount /Dos/C/
ou
mount /dev/cdrom /cdrom
On peut prciser l'option -o ro ou -r pour monter un priphrique en lecture seule, tel qu'un CD-ROM ou une disquette protge en criture par exemple. Montage du lecteur de disquettes:
mount /dev/fd0 /floppy
La commande mount sans arguments affiche les systmes de fichiers actuellement monts. Lorsqu'on crit sur un priphrique, les donnes sont envoyes quand ca arrange le systme. Pour forcer l'criture tout de suite, on peut invoquer la commande sync.
24 /84
Une autre commande utile qui permet de grer les systmes de fichiers est la commande df qui affiche l'espace occup et l'espace libre sur chaque systme de fichier mont. L'option -h permet d'afficher le rsultat en format lisible par un humain (les tailles sont affiches en Mo). Il existe aussi une commande qui donne l'espace disque occup en Ko pour chaque fichier ou rpertoire demand (pour le rpertoire courant si rien n'est spcifi). Il s'agit de la commande du.
vi: diteur pleine page
Cette commande permet d'diter des fichiers de faon plein-cran. Cet diteur peut sembler compliqu utiliser, mais il est trs puissant, et de plus a l'avantage de fonctionner sur tous les systmes UNIX quelle que soit leur taille et leur niveau d'installation. Il possde trois modes: Dplacement: c'est le mode par dfaut. Il permet le dplacement l'aide des touches du curseur sur n'importe quel caractre de l'cran. On le quitte gnralement en tapant i (insertion) ou a (ajout) pour le mode d'insertion, et en tapant : ou / pour le mode de commande. Commande: il permet d'entrer des commandes similaires celles de ed, l'diteur par ligne. Il est par exemple possible de substituer des caractres dans tout le fichier. On quitte ce mode avec RETURN. Insertion: ce mode permet d'entrer des caractres. Pour le quitter, il faut taper ESCAPE. Mode de dplacement Il est possible de se dplacer avec les touches du curseur, la touche espace, la touche RETURN et la touche BACKSPACE. D'autres fonctions sont disponibles: CTRL-G : information sur le fichier courant et la position dans ce fichier i : passage en mode insertion (avant le curseur) a : passage mode ajout/insertion (aprs le curseur) d puis d : destruction d'une ligne, mise dans le tampon J : concatnation de deux lignes x : destruction du caractre courant $ : se positionner la fin de la ligne 0 : se positionner au dbut de la ligne & : rpter la substitution prcdente p : ajouter l'endroit du curseur le contenu du tampon, (P insre avant le curseur) D : dtruire jusqu' la fin de la ligne, mise dans le tampon Y : mettre la ligne courante dans le tampon CTRL-U : une demi-page plus haut CTRL-D : une demi-page plus bas CTRL-B : une page plus haut CTRL-F : une page plus bas CTRL-L : Rrafrachir l'cran. (Rpter la commande prcdente). On notera que l'on peut prcder ces commandes par un nombre (par exemple 32Y mettra dans le tampon les 32 lignes suivantes, que l'on pourra insrer avec p). Mode d'insertion: le mode d'insertion n'autorise ni dplacement ni commande, et doit tre termin par un ESCAPE. C'est dans c. Mode de commande: les commandes, qui doivent toutes tre termines par un RETURN et commencer par un :, sont trs nombreuses. La plupart acceptent un argument numrique qui permet de rpter n fois l'opration (par exemple 5d dtruit cinq lignes depuis la position courante). En voici un chantillon: j : concatnation de lignes
25 /84
: destruction de lignes : sauver et quitter. Attention, cette commande est dangereuse car trs similaire une commande de chiffrement (celle-ci en majuscule). De plus, elle est parfois spcialement implmente si on force la sortie avec le point d'exclamation (certaines versions ne sauvegardent pas dans ce cas). Il est recommand d'utiliser plutt la combinaison wq. w : sauvegarder q : quitter n : passer au fichier suivant si plusieurs fichiers $ : se dplacer la fin du fichier set ic : ignorer la casse en recherche. Annuler avec set noic set nu : numroter les lignes. Annuler avec set nonu N'oubliez pas que dans le mode de commande, toute commande commence par : et finit par un RETURN. Si l'diteur refuse une opration (par exemple il refusera la commande q si le texte courant n'est pas sauv), on peut forcer l'excution par un point d'exclamation ajout (par exemple q!). De plus, en tapant directement le numro d'une ligne, on peut s'y dplacer. Cela est galement possible d'ailleurs en lanant l'diteur avec un argument commenant par + suivi d'un numro de ligne. Pour montrer quelques exemples de commandes complexes (il faut toujours ajouter un : avant et un RETURN aprs). On notera que $ reprsente la dernire ligne et . la ligne courante dans les spcifications d'adresse de ligne.
d x 1,$s/foo/bar/g
Equivalent.
.,$s/foo/bar/g
Remplace toutes les occurrences de foo par bar, depuis la ligne courante.
3,7s%foo/bar%bar/foo%g
Remplace aux lignes 3 7 les occurrences de la sous-chane foo/bar par bar/foo. Cela montre que l'on peut utiliser un autre caractre sparateur que /.
1,$s/foo/bar/c
Remplace toutes les occurrences de foo par bar, avec confirmation chacune (rpondre par y pour oui et n pour non.
1,$s/CTRL-VCTRL-M//g
Supprimer les retours de ligne indsirables: conversion MS-DOS vers UNIX. Notez que le remplacement est spar par un caractre, ici /, mais qui peut tre quelconque. Il faut galement faire attention car certains caractres, notamment ., *, [ et ] ont des significations particulires, il faut les prcder du caractre d'chappement. Ce dernier doit tre doubl s'il doit tre utilis tel quel. Voyez galement la signification de CTRL-V qui permet d'entrer un caractre de contrle. Certaines oprations se font sans: ni RETURN, celles-ci sont donc excutes en mode dplacement. Noter que pour rechercher des chanes, on doit utiliser la construction /chane puis RETURN, ceci sans : initial. Voyez l'tat ic dcrit plus haut.
26 /84
L'interprteur par dfaut est le Bourne Shell (sh). On peut utiliser le C-Shell (csh) ou le Korn Shell (ksh). Si le script emploie des fonctionnalits particulires ces interprteurs. Le script est interprt commande aprs commande. A chaque commande, le shell vrifie s'il s'agit d'une commande interne ou externe. Si c'est une commande externe, le shell cherche des ENSI/ Environnement Unix/ Septembre 2006 27 /84
endroits bien prcis de l'arborescence pour trouver un fichier du mme nom. Si c'est une commande externe, le shell cherchera des endroits bien prcis dans l'arborescence pour trouver un fichier du mme nom. S'il le trouve, il vrifie ensuite si le fichier est binaire ou si c'est un script. Dans les deux cas, un nouveau shell est lan pour charger le fichier binaire ou interprter le script. 4 Paramtre des fichiers scripts Les fichiers script peuvent accepter des paramtres sur la ligne de commande. Leur reprsentation l'intrieur du script est la suivante : $0 Nom de la commande $1 Premier argument $2 Deuxime argument $3 Troisime argument $4 Quatrime argument $5 Cinquime argument $6 Sixime argument $7 Septime argument $8 Huitime argument $9 Neuvime argument On peut mettre plus de 9 paramtres sur la ligne de commande. On a accs aux autres paramtres en invoquant la commande shift. Tous les paramtres sont dcals d"une position: Le premier ($1) est perdu et prend la valeur de $2. $2 prend celle de $3... $9 prend alors la valeur du dixime argument $10. On a galement les variables suivantes : $# Nombre d'arguments passs au script $$ Numro du processus SHELL en cours d'excution. $? Valeur de retour du dernier programme excut : 0 Excution russi 1 Excution interrompue. $* Liste des paramtres passe au script "$1 $2 ...$n" $@ Liste des paramtres sous forme d'lments spars "$1" "$2 "..."$n" 5 Cration des variables Les variables cres dans un shell restent locales ce shell. Elles contiennent un ou plusieurs caractres, et on peut interprter leurs contenues sous forme numrique (si c'est possible). Un nom de variables peut tre compos de lettres minuscules, majuscules, de chiffres et d'underscore "_". Un nom peut commencer par un chiffre. La longueur du nom n'a pas de limite thorique. Par convention, on utilise que des minuscules dans le nom afin de les diffrencier avec les variables du systme. (En majuscules). Pour dclarer une variable, on lui affecte une valeur. L'affectation se fait par le signe =. Il ne doit pas y avoir d'espaces de part et d'autre du signe =. Exemple: a=duac La relecture se fait en plaant un $ devant le nom de la variable.
echo $a
L'affichage de la variable prsente dans le systme se fait par la commande set. Elle liste toute les variables (utilisateurs et systmes) et donne leur valeur. On peut dfinir une variable vide: a= Le texte d'une variable peur contenir des espaces. Le texte doit alors tre encadr de guillemets ou d'apostrophes.
a="un texte avec des espaces"
28 /84
L'emploi des apostrophes est proscrire car il ne permet pas d'utiliser des variables dans le texte affecter (les variables ne sont pas substitues). On dtruit une variable en utilisant unset variable. Une variable peut tre connue en dehors du SHELL o elle a t dfinie. Elle doit pour cel tre exporte. La syntaxe pour exporter une variable est la suivante: export a L'appel d'export seul donne la liste des variables exportes. Toute modification du contenu ne peut tre transmis qu' des sous-shell. (Les modifications ne remontent pas aux shells de niveau suprieur). On emploie des {} pour isoler les noms de variables de leur environnement. Exemple: a=fic; cp ${a}1 ${a}2 est quivalent cp fic1 fic2 Sans les accolades, le shell chercherait les variables a1 et a2. La commande read permet de saisir des variables, valide par l'appui sur Entre
read variable1 [variable 2...]
Remarque: si le nombre de variables est infrieur au nombre de mots saisis, la dernire variable rcupre tout ce qui n'a pas t affect 5.1 Cration des variables L'utilisation du {} permet d'aller plus loin. Si la variable n'est pas dfinie, on peut y placer du texte par dfaut. {x: - texte} si x est vide ou non dfinie, texte vient prendre la place, sinon sa valeur vient prendre la place. {x:= texte} idem si la variable n'est pas dfinie, elle est affecte. {x:+ texte} si x est correct (dfini & non vide ) le texte prend sa place. {x:? texte} si x est vide ou non dfinie, le shell est interrrompu, texte est affich. Si texte est omis, un message d'erreur standart est affich. 5.2 Les variables systmes HOME: Chemin d'accs du rpertoire courant (o l'on arrive aprs le login, et o l'on va en tapant cd). PATH: Liste des rpertoires parcourus lors de la recherche des commandes par le shell. SHELL: Chemin d'accs du fichier programme du shell. Unix emploie un certain nombre de variables systmes utilisables depuis le shell. Ces variables permettent d'influencer le systme dans ces actions, de diriger des recherches, des paramtres d'applications. RANDOM: contient tout instant la valeur dun nombre alatoire gnr par le systme. 6 Lenvironnement d'un SHELL Chaque shell (chaque processus en gnral) hrite de l'environnement de son processus pre. L'environnement est consult par env. Lorsqu'un shell fait appel la commande (interne ou externe), celle-ci dispose de l'environnement de son parent. 7 Structure de contrle Une structure de contrle utilise gnralement une condition qui peut tre formule en utilisant la commande test. La commande Test: sert vrifier une condition. Pas de sortie l'cran (sauf en cas derreur) $? = 0: Test positif, $? = 1 sinon Effectue des tests sur: des fichiers; ENSI/ Environnement Unix/ Septembre 2006 29 /84
o option dfinit : ( -f ) est-ce un fichier ordinaire ? ( -d ) est-ce un rpertoire ? ( -c ) est-ce un priphrique type "caractre" ? ( -b ) -------------------------------------"bloc" ? ( -r ) ai-je l'autorisation en lecture ? ( -w ) ----------------------------criture ? ( -x ) ----------------------------xcution ? ( -s ) Le fichier contient-il au moins un caractre ? b) Les chaine de caractres Test -z chaine: chaine de longueur = 0 ? Test -n chaine : -------------------------- # 0 Test chaine1 = chaine2 : les 2 chaines sont-elles identiques ? Test chaine1 != chaine2: ---------------------------------diffrentes ? c) Expressions numriques
Test valeur1 -option valeur2
equal not equal less than greater than less or equa greater or equal
On peut combiner des tests avec : ! ngation du test -a ET logique -o OU logique Donc test ! -s "$a" test -d "$fichier" -a -x "$fichier"
Remarque : Il est fortement conseill d'encadrer les variables par des " " afin que si la variable n'existe pas ou est vide, la commande test ait tout de mme un argument, mme vide. De cette faon, elle ne provoque pas d'erreur d'xcution.
If...then...else if Suite commande 1 then Suite commande 2 else Suite commande 3 fi
30 /84
Ex : case $ reponse in [yYoO] *) echo "OK";; [nN] * ) echo "tan pis";; *) echo "erreur";; esac
Boucle for
for do done variable in liste-de-chaine commandes
Exemple :
Boucle while
while liste-commandes do commandes done
Until Excution jusqu' ce que la ligne de commandes renvoie vrai( ) C'est le complmentaire de while (tant que)
until liste-commandes do ... done
Break Interrompt l'xcution d'une boucle On peut passer en paramtres le nombre de niveaus traverser.
while do ... if...then...else break fi done while do while do if...then break else break 2 fi done
31 /84
... done
Continue: permet de reprendre une boucle = passage l'itration suivante. renvoie exp1 si exp1 # 0 exp2 si exp2 =0 exp1 si exp1 # 0 et exp2 # 0
On peut galement utiliser : > , >= , < , <= , != En arithmtique, on a : = , , \* , / , - , % (modulo) 9 Redirection
< ou 0< > ou 1> >err ou 2>
: Acquisition depuis le priphrique d'entre (stdin). : Envoi vers un priphrique de sortie ( stdout). : Envoi vers une sortie standard (stderr).
Exemple : somme= 'expr $somme + $valeur' 10 Les signaux Les processus peuvent changer des donnes sous forme de signaux. La commande trap permet:
trap " n signal: ignore le signal; trap 'commandes' n signal: excute les commandes la rception du signal; trap nsignal: Rtablir la raction.
11 Le Korn Shell (K-Shell) Le korn shell est une version augmente du Bourne Shell. Tout ce que nous venons de voir fonctionne en Korn Shell. Sur certains systmes comme le "CSVR4", le Korn Shell est propos en standart. Parmi les principales diffrences, notons : - La possibilit d'exploitation et rptition des commandes. - Les mcanismes d'alias. - L'extension du nombre de variables (avec des tableaux). - Les commandes supplmentaires. - L'expression "select". 11.1 Historique des commandes Les commandes tapes dans le K-shell sont stockes dans un fichier .sh-history dans le rpertoire courant. On y accde travers la commande fc. Cette commande permet de lister les dernires commandes (nombre dpendant de la variable HITSIZE), d'effectuer des remplacements.
11.2 Intgration de l'diteur VI Certaines commandes de VI on t intgres dans l'interpreteur. De cette manire, on a une souplesse accrue dans l'dition des commandes. On amorce le processus en tapant set o vi ou en affectant la variable VISUAL la valeur vi. ENSI/ Environnement Unix/ Septembre 2006 32 /84
11.3 Alias Un alias est une abbrviation, un raccourci pour des commandes ou du texte. Leur substitution est effectue en premier lieu lors de l'interprtation de la ligne par le shell. Syntaxe: alias nom_alias='liste de commandes' L'appel d'alias seul donne la liste des aliases. On peut supprimer un alias par unalias nom_alias. On peut galement exporter des alias (ce sont avant tout des variables) avec l'option -x. Syntaxe: alias -x nom_alias='liste de commandes' 11.4 Variable systme De nouvelles variables systmes apparaissent. Parmis celles-ci, notons : ENV : Fichier de commandes lire chaque cration de K-Shell. HISTFILE : Nom du fichier historique. HISTZILE : Nombre de commandes enregistrables dans l'historique. (Dfaut=128). PS3 : Prompt d'invite la saisie. RANDOM : Contient chaque accs un nombre alatoire 0...32767. 11.5 Longueur de chaine {$# variable} : Renvoie la longueur de la variable en nombre de caractre. 11.6 Tableau de variable Le K-Shell permet de faire des tableaux de variables dynamiques (on n'est pas oblig de connatre la taille du tableau). 2 modes d'affectations : var[i]=value affecte lment par lment. set -A nom_tab valeur1 valeur2 ....valeurN <=> nom_tab[0]=valeur1 nom_tab[1]=valeur1 . . . nom_tab[n-1]=valeurN {nom_tab[*]} : Affiche tous les lments du tableau. {# nom_tab[*]} : Donne le nombre d'lments du tableau. 11.7 Oprations sur les chanes
${variable <oprateur> critre}
Les oprateurs cherchent dans le texte de la variable le critre et la coupe du texte. Il ne reste que ce qui correspond au critre de selection. Oprateurs : # La plus petite apparition du critre en dbut de texte. ## La plus grande apparition du critre en dbut de texte. % La plus petite apparition du critre en fin de texte. %% La plus grande apparition du critre en fin de texte. 11.8 Type de donns
typeset -i variable dfinit une variable de type "integer". On retrouve les oprateurs du
Bourne Shell, o expr est remplac ici par let. && et || ralisent le ET et le OU logique. &, | et ^ ralisent le et, ou, ou exclusif au niveau des bits. On peut se passer du let en employant un notation abbge. Exemple: let "a=a*s" <=> ((a=a*3))
33 /84
11.9 Extension de la commande "test" test est remplac par [[ ]]. Les diffrences sont : -a (ET) et -o (OU) sont remplacs par && et || Lors de la comparaison de chanes, la seconde peut contenir un modle de critre. L'opration commence par la recherche d'oprateurs, puis il y a substitution de variables. Pour les modles de critre, les modles suivants sont valides: ?(crit1 | crit2) Seul un des critres peut survenir. *(crit1 | crit2) Chaque critre peut survenir. +(crit1 | crit2) Un des critres doit survenir une fois minimum. @(crit1 | crit2) Les critres doivent survenir au moins 1 fois. !(crit1 | crit2) Aucun critre ne doit survenir. 11.10 Nouvelle option de set Avec -o, set permet d'influencer le comportement du shell. -o fixe l'option, +o l'annule. La syntaxe est : set -o cl o cl vaut: allexport : Toute nouvelle variable est exporte bgnice :Tout processus d'arrire plan tournent plus lentement. emacs : Editeur emac intgr au ksh. ignored : ctrl d n'entrane plus la dconnexion. nodobber : La redirection > n'crase plus de fichier. vi : intgre vi au ksh. Remarque : set -o seul donne la liste actuelle des cls et leurs valeurs. 11.12 La commande select Cette commande est utilise pour batir des menus simples.
select var in liste_valeur do commandes done
Chaque valeur de la liste est affiche, prcde d'un numro puis le shell attend la saisie. La valeur est stocke dans la variable. Exemple : select nom in A B C 1) A do 2) B ..... 3) C done Numro: 12 Le C-Shell Les diffrences avec le Bourne Shell est qu'il : - Dispose d'un historique de commande, - Existe la notion d'alias, - La dfinition de variables par set, - Export par setenv, - Meilleur contrle des processus, - Notion de tableaux, distinction entre texte et nombres, - Nouvelle variable systme, - Chaque nouveau shell traite les fichiers: . login la connexion. .cshrc fichier des alias. .logout la dconnexion.
34 /84
Pour lancer le C-shell, on tape : csh (/bin) Pour terminer la session, on tape : exit ou logout. 12.1 Historique set history= nombre de commandes retenir :Dfinit la taille du tampon history Affiche les commandes avec un numro !! : Excute la dernire commande !n : Excute la commande n !-n : Excute la ncommande prcdente 12.2 Alias L'criture est diffrente, le = n'existe plus. alias nom texte Exemple : alias toto 'ls -l' On place gnralement le texte entre '' pour viter le traitement des caractres spciaux la dfinition de l'alias. unalias permet de dtruire un alias. On peut mettre * ou ? pour remplacer des ou 1 caractres dans unalias. Exemple : unalias a* => dtruit tout les alias qui commencent par a On regroupe en gnral tous les alias dans .aliases, appel dans le .cshrc par source .aliases 12.3 Structure de contrle if (expression) then commandes else commandes endif switch (texte) case critre 1: commandes; breaksw . . . default: endsw foreach var (liste valeur) commandes end while (expression) commandes end repeat nombre commandes Existence de goto, break et continue. Exemple avec goto : label: ..... . . goto label 12.4 Les variables set variable=texte @variable=nombre set tableau=(valeur1 valeur2 ...)
35 /84
echo tableau[*] => tous les lments echo tableau[i-j] => les lments de i j. set variable => variable boolenne=true <=> la variable existe. unset variable => dtruit la variable. ?variable => renvoie 1 si la variable existe, 0 sinon. Les oprateurs sur les variables sont les mmes qu'en C: =, +=, -=, *=, /=, %= 12.5 L'environnement argv : tableau des paramtres. cdpath : rpertoire courant. home : identique la variable du Bourne Shell. path : identique la variable du Bourne Shell. prompt : identique la variable du Bourne Shell. path : identique la variable du Bourne Shell. status : retour d'excution de la dernire commande. ignoreof : identique la variable du K-Shell. nodobber : identique la variable du K-Shell. filec : si elle est dfinie, elle permet l'expansion des noms de fichiers. A chaque appui sur ESCAPE, le systme complte le texte en cours en fonction de ce qui existe dans le rpertoire courant. Exemple : S'il existe un fichier de nom fichier_toto fi => fichier_toto #argv Nombre d'arguments dans argv. Le nombre de paramtres pour un script est au maximum de 1024. La premire ligne d'un script est : #!/bin/csh 12.6 Les signaux trap est remplac par la commande onintr onintr <label> --<label> commandes 12.7 Processus ctrl z :stoppe le processus en cours. bg :met le processus en cours en arrire plan. fg n : met le processus n en avant plan. bg n : met le processus n en avant plan. stop n : suspend un processus.
36 /84
Figure 3.1 : Prsentation gnrale d'un filtre Unix. Parmi les commandes qui jouent le rle de filtres citons : grep (dont egrep est une variante), tail (affichage d'une partie d'un fichier), sort, wc, tr (traduction de caractres), sed (diteur de texte non interactif) et awk qui supporte un vritable langage de programmation, proche du C, pour la manipulation des fichiers texte.
37 /84
Entre Standard
Filtre 1
Sortie standard
Tube
Filtre 2
4.1.1.1 Le mtacaractre .
Le mtacaractre . remplace dans une expression rgulire un caractre unique, l'exception du caractre retour chariot (\n). Par exemple chane. va identifier toutes les lignes contenant la chane suivit d'un caractre quelconque unique. Si vous voulez identifier les lignes contenant la chane .cshrc, l'expression rgulire correspondante est \.cshrc
On peut utiliser [] avec un ^ pour identifier le complment de l'expression rgulire. En franais pour identifier l'oppos de l'expression rgulire. Vous navez toujours pas compris ? Voici un exemple: [^0-9]toto identifie les lignes contenant une chane toto, le caractre juste avant ne doit pas tre un chiffre (exemple atoto, gtoto mais pas 1toto, 5toto). Autre exemple [^a-zA-Z] n'importe quel caractre sauf une lettre minuscule ou majuscule. Attention la place de ^, si vous tapez [1-3^], c'est quivalent aux caractres 1, 2, 3 et ^.
4.1.1.4 Le mtacaractre *
Le mtacaractre * est le caractre de rptition. L'expression rgulire a* correspond aux lignes comportant 0 ou plusieurs caractre a. Son utilisation est proscrire, car toutes les lignes, mme celles ne contenant pas le caractre a, rpondent aux critres de recherche. x* est une source de problmes, il vaut mieux viter de l'employer. L'expression rgulire aa* correspond aux lignes comportant 1 ou plusieurs caractres a. L'expression rgulire .* correspond n'importe quelle chane de caractres. L'expression rgulire [a-z][a-z]* va chercher les chanes de caractres contenant 1 ou plusieurs lettres minuscules (de a z). L'expression rgulire [^ ][^ ]* est quivalent tout sauf un blanc.
39 /84
prochane ligne du fichier traiter contenant une chane de caractre correspondant l'expression rgulire. Si l'on veut chercher une chane de caractre au sein de laquelle se trouve un caractre spcial (/, *, $, ., [, ], {, }, !, entre autres) (appel aussi mtacaractre), on peut faire en sorte que ce caractre ne soit pas interprt comme un caractre spcial mais comme un simple caractre. Pour cela vous devez le faire prcder par \ (backslash). Ainsi si votre chane est /dev, pour que le / ne soit pas interprt comme un caractre spcial, vous devez tapez \/dev pour l'expression rgulire. Les expressions rgulires peuvent remplacer la chane de caractres dans l'argument de la commande grep. Elles sont aussi utilises par plusieurs autres commandes UNIX dont awk, sed, ed et vi. Pour localiser des arrangements de caractres et d'agir sur eux. Le tableau 3.1 montre des exemples des expressions rgulires. Expression Valeur abc Cherche la chane abc n'importe o dans la ligne. ^abc Cherche la chane abc en dbut de ligne. abc$ Cherche la chane abc en fin de ligne. Cherche les lignes ne contenant que abc (commenant et se terminant par ^abc$ abc). st[a-z][aCherche n'importe quelle chane de caractres commenant par st, suivie de z]ic deux lettres minuscules et se terminant par ic (i.e static). Cherche n'importe quelle chane de caractres en dbut de ligne ^int * main commenant par int, suivie de n'importe quoi et se terminant par argc (i.e int main (int argc, char **argv)). Cherche n'importe quelle chane de caractres commenant par X, suivie de X[0-2][0-9] 0, 1, ou 2 et se terminant par un chiffre (i.e X11). [a-z]+ chane contenant au minimum un caractre en minuscule chane contenant un nombre de 4 chiffres [0-9]\{4\}$
^.$ .* [^a-z] ^$ a \* ou * "a\\\*a" \<[A-Za-z] [A-Za-z]*\> ^\(.\).*\1$ $str
chane dun seul caractre chane de caractres quelconques chane quelconque sans minuscule ligne vide chane contenant la lettre a chane contenant un asterix chane contenant deux caractres a spars de zro ou plus \ chane contenant un mot du dictionnaire dune lettre au moins chane commenant et se terminant par le mme caractre. chane contenant la valeur de la variable $str Tableau 3.2 : exemples des expressions rgulires
40 /84
Tail [+/- position [lc]] [nom_fichier] Options : +position : recopie, partir de la position donne, en partant du dbut -position : recopie, partir de la position donne, en partant de la fin l : position indique un numro de ligne c : position indique un numro de caractre
# cette commande renvoie les 15 derniers caractres du fichier fichier.c User1@localhost > tail -15 c fichier.c # affichage des quatre dernires lignes User1@localhost > tail -4 fichier.c
Options : +pos1 et pos2 permettent de dlimiter les champs utiliss pour le tri Le premier champ reprsente le nom, le deuxime le dpartement, le troisime le numro de tlphone et le dernier la ville. Le premier champ est not 0, le deuxime 1, ainsi de suite. -u : supprime les lignes doublons -m : fusion des fichiers devant tre tris -b : ignore les espaces et les tabulations en dbut de champ -r : inverse l'ordre de tri -n : trie sur des chiffres -tx : Le caractre x est considr comme sparateur de champ
41 /84
4.1.7 La commande tr
La commande tr permet de convertir une chane de caractre en une autre de taille gale. La commande tr a besoin qu'on lui redirige en entre un fichier, le rsultat de la conversion s'affiche sur la sortie standard. La syntaxe est la suivante: tr ds chaine tr [ -c] chaine1 chaine2 Les options sont les suivantes: -c: Les caractres qui ne sont pas dans la chane d'origine sont convertis selon les caractres de la chane de destination -d: destruction des caractres appartenant la chane d'origine -s: si la chane de destination contient une suite contigu de caractres identiques, cette suite est rduite un caractre unique Exemple : Soit le fichier carnet prcdent
# Pour remplacer le : par un * $ tr " : " " * " < carnet # Pour faire la mme chose on peut aussi bien diter le fichier avec cat et rediriger par pipe vers tr User1@localhost > cat carnet | tr " : " " * " # Pour remplacer les caractres de a f de minuscule en majuscule $ cat carnet | tr " [a-f] " " [A-F] " AhmEd:75:0144234452:Mahdia mEhdi:13:0466342233:Sfax
42 /84
mohAmEd:29:0298334432:Tunis sAnA:92:0133444335:Sousse
critres de la liste sont vrai. Les oprateur !, -a et -o permettent de raliser les opration logiques NON, ET, OU. \( et \) sont utilises pour le parenthsage. A dfaut dune liste, tous les fichiers.
-name motif: vrai si le motif sapplique sur le nom du fichier. Le motif doit figurer entre . -type x : vrai si le fichier est de type x. x vaut f pour dsigner un fichier ordinaire, d pour un
rpertoire, c pour un fichier spcial orient caractre, b un fichier spcial bloc, p un tube nomm
-user nom : vrai si nom est le propritaire du fichier -size [+|-]nombre[c|k]: vrai si la taille du fichier satisfait la condition sur nombre.
nombre indique la taille du fichier en octet si un suffixe c suit, en kilo octet si k suit (en bloc de 512 octets par dfaut). Pour indiquer les fichiers de taille infrieure ou suprieure nombre les prfixes et + peuvent tre utiliser (= par dfaut). actions spcifie les actions appliquer. A dfaut dune liste, print.
-print : le nom du fichier est affich -exec : introduit une commande qui sera excute. La commande place derrire exec doit
se terminer par ; Comme ; est un caractre spcial pour le shell, il doit tre masqu par le backslash. Si dans une commande place derrire exe, un accs au fichier doit tre ralis, les accolades {} sont utilises pour dsigner le nom du fichier. -ok : mme smantique et syntaxe que exec mais lutilisateur doit confirmer lexcution de la commande. Exemple :
# Afficher les fichiers C du HOME $ find $HOME name *.c -print /home/User1/tree.c # Afficher les fichiers C du HOME avec en plus leur permission User1@localhost > find $HOME name *.c -exec ls l {} \ ; -rw-rr1 User1 User1 190817 sep 6 2001 /home/User1/tree.c # Afficher les fichiers qui sont des rpertoires ou dextension C $ find $HOME \( type d o - name *.c \) -print /home/User1/tree.c /home/User1/
Par exemple, la commande qui suit explore le rpertoire en cours (identifi par le point en premier paramtre) la recherche de fichiers portant le nom prog.c (identifi par le mot-clef name) et les numre (action -print) : ENSI/ Environnement Unix/ Septembre 2006 43 /84
4.1.8.1 Critres de recherche Dans le cas prcdent, le critre utilis est le nom du fichier. Mais find peut faire sa recherche en utilisant d'autres critres. Le tableau 3.2 montre des exemples de ces critres : Il est possible de spcifier au critre -name des mta-caractres, mais il faut les mettre entre apostrophes pour viter que le shell lui-mme les interprte avant qu'ils ne parviennent la commande find :;
$ find . -name '*.Z' -print
./logiciels/emacs-19.28.tar.Z ./logiciels/gcc-2.8.1.tar.Z Les valeurs de -atime, -ctime, -mtime et -size peuvent tre signes. Par exemple, la commande suivante recherche tous les fichiers modifis depuis moins de 2 jours :
$ find . -mtime -2 -print
Explication Recherche les fichiers accds depuis les n derniers jours. Recherche les fichiers dont l'tat (permissions, nom, groupe, etc.) a t modifi depuis les n derniers jours. Recherche les fichiers modifis depuis les n derniers jours. Recherche les fichiers portant le nom n. Recherche les fichiers dont la taille est de n. La valeur n est normalement exprime en terme de blocs de 512 octets. Si n est suivi de c, la valeur est exprime en terme d'octets. Recherche tous les fichiers appartenant l'utilisateur u. Recherche tous les fichiers vides (de longueur zro) et tous les rpertoires vides (qui ne contiennent aucun fichier). Tableau 3.2 : exemples des expressions rgulires
Les critres peuvent tre combins par l'un ou l'autre des oprateurs -a (ET) et -o (OU inclusif). L'exemple suivant cherche tous les fichiers dont la taille est suprieure 100000 octets modifis depuis moins de 30 jours :
$ find . -size +100000c -a -mtime -30 -print
./projet/gcc-2.8.1.tar.Z ./projet/apache-1.2.3.tar.Z 4.1.8.2 Actions excutes Nous avons dj vu le fonctionnement de l'action -print, mais la commande find peut excuter un certain nombre d'autres actions sur les fichiers slectionns et donnes par le tableau 3.3 : Action -exec c ; -fprint f -ls Explication Excute la commande c en substituant le nom du fichier en traitement {} dans l'nonc de la commande. Enregistre le nom du fichier avec chemin complet dans le fichier f. Affiche le nom du fichier sous la forme de ls -dils. 44 /84
Tableau 3.3 : Des actions de la commande find Par exemple, l'action -ls donne plus d'informations sur le fichier que l'action -print. Dans l'exemple qui suit, find cherche tous les fichiers vides (-empty) et les enumre (-ls) :
$ find . -empty -ls
800619 29 -rw------- 1 lavc01 etudiant 0 Dec 1 1998 ./projet/journal 975298 26 -rw------- 1 lavc01 etudiant 0 Mar 26 1999 ./w3/cgi-bin/reponses L'action -exec excute une commande UNIX sur les fichiers slectionns. Il faut faire suivre le mot-clef -exec de la commande, puis d'un point-virgule (;) et find substitue le nom du fichier une pare d'accolades ({}) dans la commande. Mais, comme le point-virgule final risque d'tre interprt par le shell avant de parvenir la commande find, il faut ou bien le faire prcder d'un oblique invers (i.e. \;), ou bien le placer entre apostrophes (i.e. ';') : La commande suivante cherche tous les fichiers vides depuis le rpertoire travaux et excute la commande ls -dils sur chacun des fichiers slectionns, ce qui quivaut la commande prcdente avec l'action -ls :
$ find travaux -empty -exec ls -dils {} \;
800619 29 -rw------- 1 lavc01 etudiant 0 Dec 1 1998 ./projet/journal 975298 26 -rw------- 1 lavc01 etudiant 0 Mar 26 1999 ./w3/cgi-bin/reponses Bien sr, la commande rm peut faire l'objet de l'action -exec, mais encore faut-il l'utiliser avec beaucoup de prcaution. Une erreur est si vite arrive et si lourde de consquence. Pur cette raison, il est sage, dans un premier temps, de la remplacer par la commande ls et, aprs un contrle, rexcuter la commande find avec la commande rm. L'exemple qui suit combine des critres et utilise l'action -exec avec la commande rm. Elle efface tous les fichiers a.out et tous ceux portant l'extension .o qui n'ont pas t accds depuis plus de 7 jours :
$ find . (-name a.out -o -name *.o) -atime +7 -exec rm {} \;
Cette commande recherche dans les fichiers ou sur son entre standard des lignes de texte qui satisfont l'expression rgulire expreg indique. Sa sortie peut tre redirige dans un fichier. options -c donne seulement le nombre de lignes trouves obissant au critre -l donne seulement le nom des fichiers o le critre a t trouv -v donne les lignes o le critre n'a pas t trouv -i ne pas tenir compte de la casse (ne pas diffrencier majuscules minuscules) -n pour n'afficher que les numros des lignes trouves -w pour imposer que le motif corresponde un mot entier d'une ligne constructions grep est souvent inclus dans un tube qui lui fournit en entre le fichier tudier. Exemples: quelle est la question pose ?
cat /etc/passwd | cut -d: -f1 | grep -w "jean" > sortie # rechercher toutes les lignes commenant par les caractres
45 /84
compris entre a et d $ grep ^[a-d] carnet-adresse ahmed:75:0144234452:Mahdia # obtenir les lignes contenant la chane de caractre Tunis $ grep Tunis carnet-adresse mohamed:29:0298334432:Tunis # affichage de la liste des sous rpertoires $ ls l | grep ^d # affichage de la liste inverse $ ls l | grep v ^d
La commande grep fait partie de la famille doutil grep contenant grep, egrep et fgrep. Egrep utilise les expressions rgulires tendues. fgrep est un grep rapide sans expression rgulire. 4.1.9.2 Expressions reconnues Les expressions rationnelles (ou rgulires) sont des critres ou modles de recherche (pattern) dans les chanes de caractres. Les objectifs peuvent tre simplement de slectionner suivant ce critre, ou d'effectuer des traitements comme des subtitutions sur les chanes trouves. Leur utilisation s'tend de certains filtres shell : grep, sed, awk, vi , emacs .. des langages de scripts : perl, php .. et aux diteurs de texte : vi , emacs Attention ! Certains caractres spciaux sont communs avec les caractres gnriques de dsignation de fichiers, mais ils ont une interprtation diffrente. Donc il faut toujours prter attention au contexte. 4.1.9.3 Quelques exemples avec grep grep abc fichier recherche la chane abc dans toutes les lignes du fichier. Les lignes trouves sont envoyes sur la sortie standard, ventuellement redirige. grep " " fichier recherche les lignes qui contiennent un (et un seul) espace entre 2 mots grep "ab*c" fichier, idem avec 0 ou plusieurs occurrences de la lettre b grep "^s.*n$" fichier, reconnait les lignes dbutant par s (^s), finissant par n (n$), avec ventuellement des caractres (quelconques) intermdiaires (.*) grep "^[a-zA-Z][a-zA-Z0-9]*" [a-f]*.txt recherche les chanes commenant par une lettre suivie d'un nombre qcq de caractres alphanumriques, dans tous les fichiers dont les noms dbutent par une lettre de a f avec une extension .txt La commande grep ne reconnat pas toutes les expressions rgulires tendues. Voici la liste des symboles utilisables par grep :
. signifie un caractre quelconque * rptition du caractre situ devant ^ dbut de ligne $ fin d'une ligne (donc "e$" mots se terminant par e) [...]
46 /84
Attention Pour viter une confusion entre les interprtations de ces symboles spciaux par grep ou par le shell, il est indispensable de "verrouiller" expreg en plaant l'expression entre guillemets " " (et non entre quotes !). 4.1.9.4 Commande grep avec expressions rgulires Ainsi, nous pourrions demander grep de nous afficher toutes les lignes qui commencent par int (^int en paramtre) de tous les fichiers se terminant par .c, avec les numros de ligne (option -n) : $ grep -n '^int' *.c creer.c:118:int main modifier.c:125:int main (int argc, char **argv) Il faut toutefois prendre un soin particulier lorsque l'on utilise les caractres spciaux $, *, [, ], ^, |, (, ) et \ dans l'expression rgulire car ces caractres ont une signification particulire pour le shell. Il vaut mieux alors mettre l'expression rgulire entre apostrophes, comme dans l'exemple ci-dessus. Si l'on omet le nom de fichier, grep agit sur le fichier d'entre (stdin). Notez que les champs des lignes produites par grep (le nom du fichier, le numro de ligne et la ligne elle-mme) sont dlimits par des deux points (:), ce qui leur permet d'tre traits postriori par la commande awk et les pipes. Pour plus d'information sur la commande grep, lancez man grep. 4.1.9.5 Exemples de grep Etudier et commenter les commandes suivantes : 1. cherche dans fichier, les lignes dont la 1re lettre est qcq et la 2me doit tre o grep "^.o" fichier 2. cherche dans le fichier passwd les lignes commenant par t grep "^t" /etc/passwd 3. cherche les lignes ne commenant pas commenant par t grep -w "^t" /etc/passwd 4. cherche les lignes contenant les mots suivant le modle T.t. grep "T.t." /etc/passwd 5. cherche dans le fichier des groupes, ceux qui commencent par a ou b .. ou j less /etc/group | grep "^[a-j]" 6. pour lister les s-rpertoires du rp. /etc ll /etc | grep "^d" 7. compter les lignes saisies au clavier qui se termine par a grep -c "a$" 8. afficher les lignes des fichiers essai?.txt qui contiennent a, b ou c grep [abc] "essai?.txt" 9. dtourneR le flot de sortie du moniteur pour l'envoyer sur l'entre de wc pour ? grep [abc] "essai?.txt" | wc -l
less f3 >> f
Exemples
affiche le 5ime caractre cut -c5 fichier affiche du 5ime au 10me caractres cut -c5-10 fichier affiche le 5ime et le 10me caractres cut -c5-10 fichier affiche partir du 5ime (jusqu' la fin) cut -c5- fichier
slection champs
cut -d(sparateur) -f(slection_champs) [fichiers]
Avec la commande cut, contrairement sort, le premier champ a comme numro 1, le deuxime 2 est ainsi de suite.
# conserver les 10 premiers caractres de chaque ligne $ cut -c-10 carnet_adresse ahmed:75:0 mehdi:13:0 sana:92:01 mohamed:29 # conserver le premier et quatrime champ, le : fixant le sparateur de champ $ cut d: -f1,4 carnet_adresse ahmed:Mahdia mehdi:Sfax sana:Sousse mohamed:Tunis
4.1.12 La commande wc
La commande wc permet de compter des lignes ou des mots dans un fichiers Exemples
cat /etc/paswwd | grep /bin/bash/ | wc -l
pour compter les titulaires d'un compte pouvant se connecter avec le login shell
less /etc/paswwd | grep -vc /bin/bash/
4.1.13 La commande tr
ENSI/ Environnement Unix/ Septembre 2006 48 /84
La commande tr (Translate), est un filtre ne reconnaissant pas les expr. rgulires. Cette commande est le plus souvent associe des redirections. Les caractres entrs sont traits et le rsultat est envoy sur la sortie standard. On peut utiliser les intervalles du type a-z et les codes ASCII des caractres en notation octale \0xx. Syntaxe de la commande tr
tr [options] ch1 ch2 <fich1 >fich2
Remplace toutes les occurrences de tous les caractres de ch1 par le caractre de ch2, de mme rang, dans le flot d'entre. Exemples :
1. read ligne; echo $ligne | tr 'A-Z' 'a-z'
remplace tout caractre non inclus dans la chane chaine par le caractre car :
3. echo $ligne | tr -c a-z ' '
remplace supprime tous les caractres diffrents de a,b, ..z par un espace
4. tr -d chaine
49 /84
Tampon auxiliaire
Fichier rsultat
Figure 3.3: Mode de fonctionnement de l'diteur sed sed est une volution de l'diteur ed lui mme prcurseur de vi, il permet de raliser des commandes complexes sur des gros fichiers. 4.1.14.2 Utilisation de sed Il s'agit d'un utilitaire (sed = "Stream EDitor") qui slectionne les lignes d'un fichier texte (ou d'un flot provenant d'un pipe) vrifiant une expression rgulire et qui leur applique un traitement ou un remplacement. Syntaxe
sed [-n] [requte][-e requte] [-f script] fichier-source
L'option -n empche la sortie l'cran du rsultat (souvent associ l'option p), sed va crire uniquement les lignes concernes par le traitement (sinon il crit tout, mme les lignes non traites). Une requte sed est de la forme : [adresse1 [, adresse2]] commande [arguments] Adresse est le numro absolu d'un ligne de texte (dans le cas o il y a plusieurs fichiers sources, sed tient compte de la concatnation), $ dsigne la dernire ligne. Adresse peut tre aussi reprsente par une expression rgulire place entre deux barres (//) et dfinissant un motif figurant dans la ligne d'adresse. Le fichier source est trait ligne par ligne conformment la liste des commandes (-e) ou au fichier de commandes (-f). L'option -e n'est pas ncessaire quand vous avez une seule fonction d'dition. Il s'agit d'appliquer chaque ligne traite la requte, la liste des requtes suivant e ou les requte du script.
Attention ! : contrairement ce que l'on pourrait attendre, cette commande laisse passer toutes les lignes et ne slectionne pas celles qui ont satisfait l'expression rgulire et donc subi la substitution. Pour slectionner, voir la commande de destruction. Options
50 /84
Sans prcision, la commande ne s'applique qu' la 1re occurrence de chaque ligne. o 0...9 : indique que la substitution ne s'applique qu' la nime occurrence o g : effectue les modifications sur toutes les occurrences trouves. Exemple : sed s/moi/toi/g fich.moi > fich.toi le fichier fich.moi est parcouru, chaque occurrence de "moi", ce mot est remplc par "toi" et le nouveau fichier est sauvegard sous le nom fich.toi Dlimiteur Le slash / tant trs utilis au niveau du shell comme sparateur de niveau de rpertoire, il est possible d'utiliser sa place tout autre caractre comme #
o sed s#/home#/rep_perso#g /etc/passwd > /tmp/passwd.new
Cette option permet de filtrer les lignes qui satisfont une expression rgulire. Ces lignes ne sont pas dtruites dans le fichier d'origine, mais ne sont pas transmise en sortie. Comment modifier alors le fichier traiter ? cp fichier copie sed /.../d copie Par exemple, pour dtruire toutes les lignes vide d'un fichier : sed /^$/d
4.1.14.5 Ajout, insertion et modification Pour utiliser ces commandes, il est parfois ncessaire de les saisir sur plusieurs lignes
sed [adresse] commande\expression
4.1.14.6 La fonction de substitution s La fonction de substitution s permet de changer la premire ou toutes les occurrences d'une chane par une autre. Ci-aprs des exemples dutilisation de s: sed "s/toto/TOTO/" fichier va changer la premire occurence de la chane toto par TOTO (la premire chane toto rencontre dans le texte uniquement). sed "s/toto/TOTO/3" fichier va changer la troisime occurence de la chane toto par TOTO (la troisime chane toto rencontre dans le texte uniquement). sed "s/toto/TOTO/g" fichier va changer toutes les occurences de la chane toto par TOTO (toutes les chanes toto rencontres sont changes. sed "s/toto/TOTO/p" fichier en cas de remplacement la ligne concerne est affiche sur la sortie standard (uniquement en cas de substitution). sed "s/toto/TOTO/w resultat" fichier en cas de substitution la ligne en entre est inscrite dans un fichier rsultat.
51 /84
La fonction de substitution peut videmment tre utilise avec une expression rgulire. sed -e "s/[Ff]raise/FRAISE/g" fichier substitue toutes les chanes Fraise ou fraise par FRAISE. Voici un autre exemple d'utilisation de sed qui remplace partout la chane de caractres Roger par la chane de caractres Richard dans le fichier texte. Les changements seront produits dans le fichier de sortie ( l'cran) :
$ sed 's/Roger/Richard/g' texte
La commande de substitution s et ses paramtres doivent tre placs entre apostrophes pour les protger du shell. Le g la fin de la commande fera le remplacement de faon globale, donc partout dans le fichier. Sans l'option g, le remplacement ne se fait qu'une fois par ligne. La commande s peut accommoder des expressions rgulires. Ainsi, la commande suivante ferait la mme substitution, mais cette fois condition que la chane Roger se prsente en dbut de ligne :
$ sed 's/^Roger/Richard/g' texte
Dans les deux exemples prcdents, nous avons utilis l'oblique (/) pour dlimiter les chanes de caractres source et objet, mais il est possible d'utiliser un autre caractre, surtout le l'oblique fait partie de l'une des deux chanes (l'exemple ci-dessous utilise le +) :
$ sed -n 's+^Roger+Richard+g' texte
L'option -n de la commande sed supprime tout message que pourrait produire sed pendant son traitement. La commande y du programme sed fait le remplacement de caractres se trouvant dans la premire chane par le caractre la mme position dans la seconde chane. L'exemple qui suit en illustre le fonctionnement en faisant la conversion des lettres majuscules en lettres minuscules dans le fichier txt, spcifiant dans la chane source et objet tout l'alphabet en majuscule et en minuscule respectivement : $ sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ txt Si les commandes donner au programme sed sont trop longues pour figurer sur la ligne de commande mme, elles peuvent tre enregistres dans une fichier (appele un script sed) et le nom de ce fichier (traduire.sed dans l'exemple ci-dessous) pass au programme sed en utilisant l'option -f :
$ sed -f traduire.sed txt
3.1.14.7 La fonction de suppression d La fonction de suppression d supprime les lignes comprises dans un intervalle donn. La syntaxe est la suivante:
$ sed "20,30d" fichier
Cette commande va supprimer les lignes 20 30 du fichier fichier. On peut utiliser les expressions rgulires: sed "/toto/d" fichier Cette commande supprime les lignes contenant la chane toto. Si au contraire on ne veut pas effacer les lignes contenant la chane toto (toutes les autres sont supprimes), on tapera:
$sed "/toto/!d" fichier
En fait les lignes du fichier d'entre ne sont pas supprimes, elles le sont au niveau de la sortie standard.
52 /84
3.1.14.8 Les fonctions p, l, et = La commande p (print) affiche la ligne slectionne sur la sortie standard. Elle invalide l'option -n. La commande l (list) affiche la ligne slectionne sur la sortie standard avec en plus les caractres de contrles en clair avec leur code ASCII (deux chiffres en octal). La commande = donne le numro de la ligne slectionne sur la sortie standard. Ces trois commandes sont utiles pour le dbogage, quand vous mettez au point vos programmes sed.
sed "/toto/=" fichier
Cette commande va afficher le numro de la ligne contenant la chane toto. 3.1.14.9 Les fonctions q, r et w La fonction q (quit) va interrompre l'excution de sed, la ligne en cours de traitement est affiche sur la sortie standard (uniquement si -n n'a pas t utilise). La fonction r (read) lit le contenu d'un fichier et crit le contenu sur la sortie standard. La fonction w (write) crit la ligne slectionne dans un fichier. Par exemple, la commande sed "/^toto/w resultat" fichier va crire dans le fichier resultat toutes les lignes du fichier fichier commenant par la chane toto. 3.1.14.10 Les fonctions a et i La fonction a (append) va placer un texte aprs la ligne slectionne. La syntaxe est la suivante:
a\ le texte
La fonction i (insert) va placer un texte avant la ligne slectionne. La syntaxe est la suivante:
i\ le texte
Si votre texte tient sur plusieurs lignes la syntaxe pour le texte est la suivante:
ligne 1 du texte\ ligne 2 du texte\ ligne n du texte\ dernire ligne
Concrtement vous pouvez appeler la fonction i ou a dans un fichier de commande de sed. Par exemple, soit votre fichier prog.sed suivant:
1i\ dbut du traitement s/[tT]oto/TOTO/g $a\ fin du traitement\ de notre fichier
On excute la commande en tapant: sed -f prog.sed fichier-a-traiter prog.sed a pour effet d'inscrire avant la premire ligne (1i) le texte "dbut de traitement", et aprs la dernire ligne ($a) le texte "fin du traitement (retour la ligne) de notre fichier".
53 /84
La sous expression (sous chane) \([0-9][0-9]*\) dsigne un ou plusieurs chiffres, chacun sera entour des caractres aa. La chane to2to deviendra toaa2aato.
Les arrangements sont des expressions, les mmes que dans egrep, ou peuvent tre encore plus comliqus. Awk fournit deux expression particulires, BEGIN et END; Les actions associes BEGIN sont ralises avant que la premire ligne soit lue, ce sont couramment des actions d'initialisation des variables. Le programme peut tre simple et figurer sur la ligne de commande ou, s'il est plus complexe, il peut avoir t enregistr dans un fichier. 4.1.15.1 Fonctionnalits
Cet utilitaire, comme sed, s'applique un fichier, ou un flot de donnes provenant de son entre, si le fichier (prcd de -f) est absent. Il lit ce fichier ligne par ligne (toutes les lignes par dfaut). Les lignes sont spares par des retour-chariots. Il dcompose chaque ligne (enregistrement) en champs, les champs tant des chanes de caractres spares les unes des autres par un caractre particulier appel le sparateur. Ce caractre de sparation peut tre fourni explicitement, sous la forme de l'option -F":", par exemple, ou invoqu dans le motif d'une expression rationnelle. Les champs du programme awk sont en effet appels $1, $2, $3, etc et $0 pour la ligne entire. NF est une variable indiquant le nombre de champs de la ligne courante.
awk '/expression rgulire>/{print}'<fichier> fait la mme chose que egrep. awk '{print}' <fichier> fait la mme chose que cat.
Par exemple : et
54 /84
4.1.15.2 Utilisation de awk Considrons, titre d'exemple, le fichier de donnes exemple.txt: helene 56 edu hcyr@sun.com jean 32 ri jeanc@inexpress.net julie 22 adm juliem@sympatico.ca michel 24 inf michel@uqo.ca richard 25 inf rcaron@videotron.ca La commande awk suivante excute sur le fichier ci-dessus affiche le premier champ. Comme aucun arrangement n'a t spcifi, l'action { print $1 } s'applique tous les enregistrements du fichier :
$ awk '{ print $1 }' exemple.txt
helene jean julie michel richard Les champs du programme awk sont en effet appels $1, $2, $3, etc et $0 pour la ligne entire. Notez aussi la prsence d'apostrophes pour cadrer le programme en argument afin de le protger de toute interprtation que pourrait faire le shell de certains caractres spciaux. L'arrangement NR > 1 pourrait tre spcifi pour sauter le premier enregistrement, NR reprsentant le numro de l'enregistrement ( Number of the Record ) : $ awk 'NR > 1 { print $1 }' exemple.txt jean julie michel richard Le programme awk pourrait aussi afficher les deux premiers champs (champ 2, puis champ 1) et comporter une comparaison pour limiter la slection aux seuls enregistrements dont le second champ est suprieur 24 :
$ awk '{ if ($2 > 24) print $2, $1 }' exemple.txt
56 helene 32 jean 25 richard Nous aurions pu obtenir le mme rsultat en spcifiant l'arrangement $2 > 24, au lieu d'inclure la commande if :
$ awk '$2 > 24 {print $2, $1}' exemple.txt
56 helene 32 jean 25 richard Au lieu de la commande print, nous pourrions utiliser la commande printf qui permet le formatage. Elle fonctionne comme son guivalent dans le langage C. Les masques de formatage de la commande printf %-10s et %6d signifient respectivement d'afficher une chane de caractres sur 10 colonnes et de la justifier gauche, puis d'afficher un champ numrique sur 6 colonnes (justifi droite par dfaut) :
$ awk '{ if ($2 > 24) printf ("%-10s %6d\n", $1, $2) }' exemple.txt
56 32 25
55 /84
Nous pouvons ajouter un titre notre liste en utilisant l'arrangement BEGIN (mot rserv) pour lequel l'action s'applique avant la lecture des enregistrements (la commande awk de cet exemple a t dcompose en plusieurs lignes ici afin de mieux l'illustrer, mais elle doit tre entre sur une mme ligne) :
$ awk 'BEGIN { printf ("Nom Numro\n---------- ------\n") } NR >= 1 { if ($2 > 24) { printf ("%-10s %6d\n", $1, $2) } }'
exemple.txt Nom Numro ---------- -----helene 56 jean 32 richard 25 Il ne reste plus qu' faire le total des valeurs contenues dans le second champ et de les afficher la fin. L'arrangement END (mot rserv) s'applique la fin de la lecture de tous les enregistrements (la commande awk de cet exemple a t decompose en plusieurs lignes ici afin de mieux l'illustrer, mais elle doit tre entre sur une mme ligne) :
$ awk 'BEGIN { printf ("Nom Numro\n---------- ------\n"); total = 0; } NR >= 1 { if ($2 > 24) { printf ("%-10s %6d\n", $1, $2); total += $2 } } END { printf (" ------\n %6d\n", total) }'
exemple.txt Nom Numro ---------- -----helene 56 jean 32 richard 25 -----113 Le programme de awk, devenu un peu long, peut tre enregistr dans un fichier et son nom pass en paramtre en utilisant l'option -f. Si le programme est enregistr dans fichier liste.awk comme suit :
BEGIN { printf ("Nom Numro\n---------- ------\n"); total = 0; } NR >= 1 { if ($2 > 24) { printf ("%-10s %6d\n", $1, $2); total += $2 } } END { printf (" ------\n %6d\n", total) }
Alors, la commande awk suivante faisant appel ce fichier produirait le mme rsultat :
$ awk -f liste.awk exemple.txt
56 /84
Nom Numro ---------- -----helene 56 jean 32 richard 25 -----113 4.1.15.3 Autres options dun programme awk Il existe dans le systme UNIX plusieurs fichiers dont les champs contiennent des blancs et que ces champs doivent tre dlimits par un caractre autre que le blanc, comme le deux-points (:) (par exemple le fichier passwd). Il en est de mme des donnes produites par le programme grep. Il est possible de dire awk d'utiliser un autre caractre pour dlimiter les champs, ceci en utilisant l'option -F. Ainsi, si notre fichier exemple.txt d'origine pourrait tre ainsi constitu : helene:56:edu:hcyr@sun.com jean:32:ri:jeanc@inexpress.net julie:22:adm:juliem@sympatico.ca michel:24:inf:michel@uqo.ca richard:25:inf:rcaron@videotron.ca Il serait possible de le traiter avec le mme programme awk, tout en spcifiant l'option -F:, pour lui indiquer que le dlimiteur des champs est le deux-points (:) :
$ awk -F: -f liste.awk exemple.txt
Nom Numro ---------- -----helene 56 jean 32 richard 25 -----113 Et, bien sr, la casse a son importance ; il ne faut pas confondre les options -F et -f. 4.1.15.4 Instructions dun programme awk Le langage de awk comporte les instructions suivantes : if ( condition ) instruction [ else instruction ] while ( condition ) instruction for (expression ; condition ; expression ) instruction break continue { [ instruction ] } variable = expression print [ liste-dexpressions ] [ >fichier ] printf [ liste-dexpressions ] [ >fichier ] next (saute les arrangements rsiduels de cet enregistrement) exit (saute le reste des enregistrements)
57 /84
Les expressions sont des entiers ou des chanes de caractres et sont assembles par les oprateurs +, -, *, /, % et la concatenation (une espace). Les oprateurs de C++ --, +=, -=, *=, /= et %= sont galement valides. Les variables peuvent tre des scalaires, des tableaux (notation a[i]) ou des champs ($1, $2, etc.). Les constantes de chanes de caractres sont dlimits par des guillemets ("). La fonction length donne la longueur de l'argument qui lui est prsent ou de toute la ligne s'il n'y a pas d'argument. Si l'on omet le nom du fichier, awk agit sur le fichier d'entre stdin. Le programme awk est trs utile dans les pipes. Pour plus d'information sur la commande awk, lancez man awk. 3.1.15.5 Exemple dexprimentation Voici un mini-tutoriel qu'il est conseill d'exprimenter. Il utilise le fichier /etc/passwd suppos bien connu. Son format de ligne est : login:x:uid:gid:commentaire:home:shell 1. Voici une syntaxe simplifie : awk -F":" 'bloc-programme' /etc/passwd o L'option -F":" signale que le caractre sparateur est ":" dans ce fichier. o Le bloc-programme, entour de {} s'appliquera chaque ligne. Il contient souvent print, l'instruction d'affichage sur la sortie standard, et des chanes constantes entoures de " ". A noter que print, seul, affiche toute la ligne et insre un retour-chariot. o Par exemple la commande :
awk -F":" '{print "Ligne n " NR "=" $0}' /etc/passwd
affiche les lignes (rfrences par la variable systme $0), prcdes de leur numro (contenu dans NR) Comparer avec awk -F":" '{print}' /etc/passwd 2. Chacune des lignes est dcoupe par awk suivant ":" en 7 champs, dont les valeurs individuelles sont affectes aux variables systme $1, $2 ... jusqu'au dernier. Par exemple, soit la commande :
awk -F":" '{print "Le rpertoire personnel de " $1 " est " $6}' /etc/passwd
applique la ligne particulire toto:x:520:521:Monsieur Toto Jules:/home/toto:/bin/bash, elle fera afficher : Le rpertoire personnel de toto est /home/toto 3. awk -F":" '{print "Le nombre de champs = " NF " et le dernier vaut " $NF
}' /etc/passwd
Cette commande affiche le nombre de champs pour chaque ligne et la valeur du dernier. Ce nombre de champs est contenu dans la variable prdfinie NF, ici 7, et la valeur du dernier champ peut alors tre rfrence par $NF 4. awk -F":" '{print "Premier champ : "$1 " ; print "Et dernier : $NF }'
/etc/passwd
Bien noter que le bloc d'instruction (appel souvent le bloc "action") est entour
58 /84
d'accolades, et que le point-virgule est le sparateur d'instructions. Dans l'exemple, comparer au prcdent, chaque print fait passer la ligne. 5. awk -F":" '{ if ($3 >= 500 ) print "login " $1 " uid = " $3 " rp
perso : " $6}' /etc/passwd
Les utilisateurs crs par root ont un numro, leur uid, attribu partir de 500. La commande permet de slectionner ces utilisateurs et d'afficher leur login, leur uid et leur rpertoire personnel. Exercice d'application Slectionner les utilisateurs prcdents, extraire leur login et leur nom complet (normalement 5me champ $5), les trier par ordre alphabtique et les stocker dans le fichier users.txt 6. Dans l'exemple prcdent, la slection est effectue par une expression relationnelle, autrement dit une comparaison Les oprateurs de comparaison usuels peuvent s'appliquer (attention : l'galit s'exprime avec ==, la diffrence avec !=) ainsi que les oprateurs boolens : && (et), ||
(ou) , ! (non)
Elle extrait les comptes d'uid suprieurs 500 (grce $3>=500) et commenant par la lettre "j". En effet, l'appel la fonction prdfinie substr( $1, 0, 1) extrait une souschane du nom ($1) partir du 1er caractre (numro 0) et sur une longueur 1, autrement dit l'initiale du nom. 7. On peut aussi slectionner les enregistrements d'un fichier grce une expression rationnelle (rgulire). Par exemple la commande :
awk -F":" ' $1 ~/^[a-fj]/ { print NR $0 }' /etc/passwd
slectionne les lignes commenant par une lettre appartenant l'intervalle de a f, ou par j, et les affiche avec leur numro de ligne. Attention ! l'oprateur [..] applique un OU implicite entre les lettres qu'il contient.
4.2 La redirection
La redirection consiste rediriger la sortie d'une commande dans un fichier, plutt que de la voir apparatre l'cran. La redirection peut s'avrer intressante dans le cas o l'on veut enregistrer le rsultat d'une commande pour l'analyser plus tard. Par exemple, la sortie de la commande ls de l'exemple suivant serait transmise dans le fichier liste.txt, plutt que d'tre affiche l'cran : $ ls -l > liste.txt
45 Ici, la commande ls est excute, sauf que sa sortie, au lieu d'tre affiche l'cran, est transmise comme fichier d'entre la commande wc -w. Rappelons que la commande ls fait l'numration des fichiers du rpertoire en cours. Cette numration est alors soumise la
59 /84
commande wc -w qui en compte les mots (option -w). Ce qui est affich est donc le nombre de fichiers. La redirection et le pipe peuvent coexister dans la mme commande. Par exemple, le pipe suivant combine les commandes ls et awk et redirige la sortie dans le fichier MesGrosFichiers :
$ ls -l | awk '$5 > 10000 { print $9 }' > MesGrosFichiers
La commande ls produit donc une liste des fichiers du rpertoire en cours. Cette liste est ensuite prsente au programme awk qui imprime le champ 9 (le nom du fichier) pour toutes les lignes o le champ 5 (taille du fichier) est plus grand que 10000. Enfin, la sortie du programme awk est redirige dans le fichier MesGrosFichiers qui pourra tre examin plus tard.
luna.tar.Z sol.tar.Z Avec l'option -a, la commande tee n'crase pas le fichier en paramtre mais ajoute les donnes sa fin.
$ ls -l | awk '$5 > 10000 { print $9 }' | tee -a MesGrosFichiers
luna.tar.Z sol.tar.Z 4.2.3 Gestion de l'affichage (more) La commande more permet d'effectuer une gestion sommaire de l'affichage produit par une commande. Ainsi, une commande qui produirait un nombre de ligne suprieur la capacit de l'cran ou de la fentre pourrait tre conjugu la commande more. Cette commande suspend l'affichage lorsque la fentre est remplie (pour viter que les lignes se perdent) et reprend lorsque l'on pse sur la barre des espaces. La commande more n'est pas trs utilise lorsque l'on travaille sur une station Sun avec une interface graphique car les fentres Command Tool dans lesquelles sont excutes les commandes permettent par dfilement de revenir en arrire. La commande more est plutt utile lorsque l'on travaille partir d'un terminal ou d'une sance telnet sur un micro-ordinateur incapable de faire le dfilement. Ainsi, pour obtenir une liste de ses fichiers, page par page, il faudrait entrer comme suit la commande ls:
$ ls -l | more
La commande more peut tre utilise hors du contexte des pipelines pour lister un fichier page par page :
$ more MesGrosFichiers
Par exemple, en combinant ps, grep et awk, vous pourriez produire une liste des processus qui excutent rlogin et donner les champs 1 et 2 des informations affiches par ps -ef (respectivement le propritaire et le numro du processus) en faisant :
$ ps -ef | grep rlogin | awk '{ printf ("%-8s %s\n", $1, $2) }'
lavc01 11358 lavc01 1182 abcd02 11356 root 1183 lavc01 1187 wxyz01 11359 mnop04 11355 $
abcd02 11356 lavc01 1182 lavc01 1187 lavc01 11358 mnop04 11355 root 1183 wxyz01 11359 $
La commande cat en tte du pipeline concatne d'abord tous les fichiers portant l'extension .html (les regroupe ensemble) et en prsente le rsultat au programme sed qui en retire toutes les commande HTML (entre crochets <>) pour rediriger le tout dans le fichier texte. Cette manipulation permettrait de regrouper tous les fichiers d'un site Web et d'en retirer ensuite toutes les commandes HTML. Ceci produirait un fichier sur lequel on pourrait effectuer une vrification orthographique ou grammaticale sans devoir contourner les commandes HTML. Il est possible de transmettre plusieurs commandes au programme sed en les sparant par un point-vigule. Ainsi, il serait possible d'ajouter au pipeline prcdent une autre commmande au programme sed pour enlever les lignes vides (rsultant du retrait des commandes HTML), en ajoutant /^$/d, ce qui supprimerait le lignes n'ayant rien entre le dbut (^) et la fin de la ligne ($) :
$ cat *.html | sed 's/<.*>//g;/^$/d' > texte
61 /84
date de cration Le fichier /usr/include/sys/stat.h contient la prdfinition d'une structure C correspondant la structure physique d'un i-nud.
Struct stat { dev_t ino_t ushort st-dev st_ino st_mode /* priphrique d'i-nud*/ /*numro d'i-nud*/ /*bits de mode, bits 15 12 type, bits 11 0 droits d'accs*/ /* nombre de liens*/ /*id propritaire*/ /*id groupe*/ /*numro de la resource d'un fichier special*/ /*taille du fichier en octets*/ /*date dernier accs*/ /*date dernire modification (criture)*/ /*date dernire modification de
short st_nlink ushort st_uid ushort st_gid dev_t st_rdev off_t st_size time_t st_atime time_t st_mtime time_t st_ctime caractristique*/ }
Les types utiliss sont prdfinis dans le fichier /usr/include/types.h. Le champ st_mode contient un ensemble d'indicateurs dcrivant le fichier, pour simplifier, la dfinition de ces indicateurs fait partie de <sys/stat.h>.
S_IFMT S_IFDIR S_IFCHR S_IFBLK S_IFREG S_FIFO S_ISUID S_ISGID S_ISVTX S_IREAD S_IWRITE S_IEXEC 0170000 0040000 0020000 0060000 0100000 0010000 04000 02000 01200 00400 00200 00100 /*type ficher*/ /*catalogue*/ /*fichier special caractre*/ /*ficher block special*/ /*fichier ordinaire*/ /*tube ordinaire ou tube nom(fifo)*/ /*set_uid bit positionn (permission utilisateur)*/ /set_gid bit positionn (permission groupe)*/ /sticky bit positionn*/ /*permission lecture propritaie.*/ /*permission criture propritaire*/ /*permission excution propritaire*/
St_mode: la valeur retourne dans ce champ est des bits combins indiquant le type de fichier, les bits d'attributs et un rsum des droits d'accs. 15...12 11 10 9 8 type setuid setgid sticky r Le type est dtaill comme suit: w x r w x r w 0 x
15 14 13 12 Type fichier 0 0 0 0 donne 0 1 0 0 rpertoire 0 0 1 0 Spcial caractre 0 0 0 1 Spcial bloc Le bit STICKY (Save Text Image after Execution) indique que le code doit tre conserv en fin d'excution pour viter de refaire appel au SGF de nouveau. Les bits SetUid (resp SetGid) permette de demander ce qu'un utilisateur qui excute le fichier, acquire, temporairement, les droits d'accs du propritaire (resp le groupe). La table des i-nuds (inodes) regroupe l'un aprs l'autre autant d'inodes que de fichiers contenus dans le FS. Le numro d'i-nuds d'un fichier correspond son rang dans la table des i-nuds. Le premier champ constituant d'un i-nuds est le type du fichier ; il existe trois types de fichiers en UNIX : les fichiers rpertoires; les fichiers ordinaires et les fichiers spciaux (trois types possibles : type caractre, type bloc, et pipes nomms). ENSI/ Environnement Unix/ Septembre 2006 63 /84
L'i-noeud d'un fichier est trait par deux fonctions stat et fstat (stat utilise le nom du fichier et fstat utilise le descripteur), les deux fonctions retournent l'information sur l'i-noeud ou 1 en cas d'erreur. L'exemple du programme C suivant montre leur utilisation dans la surveillance d'une boite aux lettres.
#include <stdio.h> #include <sys/types.h> char *maildir="usr/spool/mail" main(argc,argv) int argc; char * argv[]; { struct stat buf; char *nom, *getlogin(); int dertaille=0; nomg=argv[0]; if((nom=getlogin())= = NULL) error("Nom de connexion inconnu", (char*)0); if(chdir(maildir)= = -1) error("cd impossible vers %s",maildir); for(..) { if stat(nom, &buf)= = -1) buf st_size=0; if (buf st_size > dertaille) fprintf(sderr,"\n Vous avez du courier"); dertaille=buf st_size; sleep(60); } }
N Bloc 0 1
64 /84
Table des i-nodes (16 i-nodes par bloc) Adresse d'indirection Zone de donnes (Fichiers espace libre) Zone rserve par le systme en cas de saturation de la zone de donnes Les adresses d'indirection sont utilises pour la localisation des fichiers de taille suprieure 10 blocs N et M correspondent des nombres calculs par la machine lors de la cration du FS en fonction du nombre d'i-nodes que vous avez rservs. Pour crer un FS, il vous faut utiliser la commande mkfs (Make File System) Tableau 4.1: structure d'un systme de fichiers Unix Dans le super bloc, le noyau lit les informations concernant la table des i-nuds et par son biais, accde aux fichiers. Structure d'un super bloc Contenu Taille en blocs de la table des i-nodes Taille en blocs du file system Liste des blocs libres Adresse du premier bloc libre Liste des i-nodes libres Numro du premier i-node libre Flag de verrouillage pendant la mise jour des 4 champs prcdents Flag de verrouillage pendant la mise jour de la table des inodes Flag de modification du super bloc Flag de lecture seule Date de la dernire modification du super bloc Information sur le device (sur lequel se trouve le FS) Nombre de blocs libres Nombre d'i-nodes libres Nom du file system Nom "pack" du file system Zone d'ajustement tat du file system Nombre magique du file system Type du file system Tableau 4.2: structure d'un super bloc Unix
Champ s_isize s_fsize s_nfree s_free s_ninode s_inode s_flock s_ilock s_fmod s_ronly s_time s_dinfo s_tfree s_tinode s_fname s_fpack s_fill s_state s_magic s_type
d'entre sortie est faite sur un fichier, ce descripteur servira le dsigner la place de son nom. Un programme ne peut traiter un fichier qu' travers son descripteur. Un programme lanc par le shell, hrite de trois fichiers ouverts dont les descripteurs sont (0: entre standard, 1: sortie standard et 2: sortie d'erreur standard). Ces descripteurs, s'il n'y pas eu une redirection, dsigne le clavier et le terminal. Si le systme ouvre d'autres fichiers, les descripteurs seront 3, 4, etc. Si les E/S sont rediriges vers un fichier ou un tube, le shell modifie l'assignation par dfaut de deux descripteurs 0 et 1. Le descripteur 2 reste connect au terminal, pour que les messages d'erreurs y apparaissent.
5. 3 Les rpertoires
Les rpertoires accessibles en lecture, permettent l'utilisateur de cataloguer les fichiers contenus. Un rpertoire est un fichier spcial regroupant des enregistrements de 16 octets, ou chaque structure contient le numro d'i-node (2 octets), et le nom du fichier (14 octets). la cration d'un rpertoire, deux structures reprsentant le rpertoire courant et le rpertoire 'pre', sont intgrs au fichier. Le systme d'exploitation se charge de mettre jour leur contenu tout au long de l'exploitation. La description prcise se trouve dans <sys/types.h> qui doit inclure <sys/dir.h>. En ce qui concerne la cration d'un catalogue; elle ne peut se faire que par l'intermdiaire de la primitive mknod et sa suppression par la primitive unlink et dans le cas o on est superutilisateur.
#include <sys/direct.h> catalogue(dir) char *dir; { int fd; struct direct nbuf; if(!dir) dir="."; if((fd=open(dir,0))= = -1) return 1; while(read(fd, (char*)&nbuf,sizeof(struct direct))>0) printf("%\n",nbuf name); close(fd); return 0; }
Opration E/S int creat (nom, droits) char * nom; int droits; /droits d'accs*/
Description cration
Int open (nom, mode, droits) ouverture char * nom; int mode; /*mode ouverture*/
Valeur de retour Descripteur du fichier cr et 1 dans le cas contraire; Si le fichier existe dj, sa longueur est rduite zro. Descripteur du fichier (fopen retourne un pointeur) et 1 en cas d'erreur, le fichier doit tre dj 66 /84
int droits; Int write (fd, buf, n) criture int fd; /*descripteur fichier*/ char buf[SIZE]; /*tampon*/ int n; /*nbr octets transfrs*/ Int read(fd, buf, n) lecture int fd; /*descripteur fichier*/ char buf[SIZE]; /*tampon*/ int n; /*nbr octets transfrs*/
Int lseek(fd, depl, origine) Accs alatoire int fd; /*descipteur*/ long depl; /*deplacement*/ int origine; /*0: dbut; 1: courant; 2: fin*/ int dup (fd) Duplication ou Un descripteur ayant les mmes int fd; synonyme de fichier caractristiques, -1 en cas d'erreur int close(fd) fermeture Fermeture d'un fichier. int fd; int stat(nom, stbuf) Traitement d'i-noeud Information d'i-nud ou 1 en cas char nom; /nom fichier*/ d'erreur struct stat * stbuf; /* buffer de trasnfetr*/ int fstat(fd, stbuf) Traitement d'i-noeud Information d'i-nud ou 1 en cas int fd /*descripteur fichier*/ d'erreur struct stat * stbuf; /* buffer de trasnfetr*/ Tableau 4.3: Les Oprations d'E/S de base dans Unix Exemple d'un fichier rpertoire : Numro i-node 24 23 26 27 35 Nom du fichier . .. fic1 fic2 rep1
cr et les droits doivent concider. Nombre d'octets rellement transfrs. SIZE est le plus souvent fix 512 ou 1024 octets (paramtre BUFSIZE de <stdio.h>). Nombre d'octets rellement transfrs. SIZE est le plus souvent fix 512 ou 1024 octets (paramtre BUFSIZE de <stdio.h>). La nouvelle position ou 1 en cas d'erreur.
Les fichiers ordinaires stockent les programmes et les donnes; le systme n'impose aucun format particulier aux fichiers et les traite comme des squences d'octets. Les fichiers spciaux sont des contrleurs de priphriques qui permettent de grer les entres-sorties de faon transparente; en effet, un processus utilisateur peut indiffremment envoyer ou recevoir des donnes vers/depuis un fichier ou un priphrique. Les fichiers spciaux correspondant aux priphriques sont stocks dans le rpertoire /dev (devices) du systme de fichiers.
67 /84
10 14 6 4 3
Tableau 3: Extrait de la liste des signaux Unix Remarque : pour voir la totalit des messages envoyables sous UNIX, faites: kill -l
68 /84
valeur de pid: si >0, le signal ira en direction du processus de numro pid (nous laisserons de ct ici les cas pid =0, pid<0...) retour du kill: renvoie 0: l'appel s'est bien droul renvoie -1: l'appel s'est bien droul valeur de sig: <0 ou >NSIG: valeur incorrecte 0: pas de signal envoy mais test d'erreur: sert tester l'existence d'un processus de numro pid par exemple sinon: signal de numro sig
Exercice 1 : crire un programme qui ignore tous les signaux. Piste pour l'crire: ... printf("Coucou, recu signal %d ! mais je l'ignore !\n", Numero); ... for (Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++) ... Lui envoyer des signaux depuis une autre fentre par la commande UNIX: kill -num_signal num_processus. Ce programme les ignore-t-il tous ? Exercice 2 : crire un programme qui :
Traite tous les signaux par une fonction fonc qui se contente d'afficher le numro du signal reu, Traite le signal SIGUSR1 par une fonction fonc1 et le signal SIGUSR2 par fonc2. - fonc1 affiche le numro du signal reu et la liste des utilisateurs de la machine (appel who par system ("who")) - fonc2 affiche le numro du signal reu et l'espace disque utilis sur la machine (appel df . par system("df .")) Lancer le programme et lui envoyer des signaux, dont SIGUSR1 et SIGUSR2, depuis une autre fentre, l'aide de la commande kill.
70 /84
Un processus peut se dupliquer par le biais de lappel systme fork ; le processus cr est alors appel fils, et son image diffre du pre uniquement par son numro didentification (PID). La notion de thread, plus rcente, permet de dcomposer un programme en plusieurs "sous-processus", appels threads. En cours de son excution, un processus peut se trouver dans l'un des deux modes: Le mode utilisateur (user mode) qui correspond la partie pour laquelle le processus est programm. Il excute les instructions du programme et ne peut accder qu' ses donnes dans son espace d'adressagee. Par exemple ajouter x y et ranger le rsultat dans z). Le mode privilgi, dit aussi mode systme ou mode noyau (kernel mode), o il excute des instructions qui appartiennent au noyau et qui sont normalement interdites un programme. Ce sont les primitives systmes ou bien les gestionnaires d'interruptions qui les excutent; Dans ce mode, un processus peut accder d'autres donnes que les siennes propres, comme les tables du systme ou celle d'autres utilisateurs. Le passage du mode utilisateur au mode noyau se fait par appel aux primitives systmes. C'est le cas par exemple pour raliser une E/S ou dialoguer avec un terminal: on peut ainsi accder des zones mmoires particulires et communiquer avec un gestionnaire de priphriques. Ce passage (ou privilge) ne dure bien sr que le temps d'excution de la primitive; Il peut aussi tre provoqu par un signal externe, interruption, qui ncessitera un traitement particulier fait par un gestionnaire (handler) d'interruptions. Les processus dits systme sont enclenchs par le noyau. Chaque processus utilisateur dialogue avec lextrieur par le biais de trois fichiers particuliers qui sont ouverts en permanence : lentre standard (standard input, handle 0) ; la sortie standard (standard output, handle 1) ; la sortie derreur standard (standard error output, handle 2) ; Par dfaut, ces fichiers sont lis au terminal, et reprsentent le clavier (input) et lcran (output). Il est possible de rediriger ces fichiers standards vers des fichiers diffrents en utilisant les sigles de redirection <et << reprsentant lentre du processus, et > et >> reprsentant la sortie du processus (voir Le shell/Redirection des entres-sorties pour plus de dtails).
gnralement dchanger des donnes entre processus. Les mcanismes suivants sont mis en place cet effet:
La commande ps -x dtaille davantage cette liste. La commande top effectue, en temps rel un affichage encore plus prcis de l'ensemble des processus en cours d'excution. Mise en arrire et avant plans Exemple : Crer le script essai dont le contenu est le suivant: date sleep 2 Lancer le script essai par essai &. Le caractre & permet de lancer le processus en arrire-plan (background), c'est--dire qu'il se droulera en tche de fond. Essayez pour vous amuser taper d'autres commandes telles que ls -l, etc. Vous verrez alors, qu'imperturbable, le script essai vous affichera toutes les 2 secondes la date et l'heure. Pour terminer le processus essai qui ne s'arrte avec aucune combinaison de touches du clavier, voyons une solution: Taper fg Le processus revient alors en avant plan (fg pour foreground).il suffit ensuite de faire CTRL + C pour arrter le processus. A prsent, tapez: ps puis ps -x. Enfin, relancez le processus essai en background. On pourrait ds lors imaginer une autre solution pour tuer le processus essai qui consisterait : 1) retrouver le numro de PID (processus identity) associ au processus essai, 2) tuer ce processus par kill -9 <bon numro de processus>.!!! Attention, ici, on a malheureusement du mal retrouver le bon processus tuer. Aussi ne faites pas de kill la lgre car si vous vous trompez de numro de PID, vous risquez d'tre purement et simplement coinc... si cela arrive, appelez nous. Bref, il semble plus sage de revenir la solution du passage en avant-plan pour venir bout de ce processus.
73 /84
Actif Utilisateur
Mode Utilisateur
Nouveau
Prt
Actif Noyau
Zombi
Endormi
Prt swap
Endormi swap
Mode swap
premption 7
retour
Prempt
sleep 9 Zombi 4 Endormi en mmoire swap out wake up 6 Endormi en zone swap wake up
Ordonnancement du processus Prt en mmoire 3 Mmoire suffisante 8 swap out swap in Mmoire insuffisante 5 Prt en zone swap
fork
Figure 4.1: Etats d'un processus Quelques commentaires: perror: sert renvoyer un message d'erreur plus explicite que celui qui serait gnr avec un simple printf.
74 /84
Dans certains cas, le processus fils renvoie 1 comme valeur de numro pre alors que visiblement le numro de son pre n'est pas 1. La raison en est simple: si le pre a fini son excution avant le fils, le systme octroie alors le numro du premier processus cre qui vaut 1. Compilez ce programme. Excutez le.
d'une plate-forme UNIX l'autre (dans la pratique son type se confond souvent avec le type int). La smantique de cette primitive est la suivante: o si le processus ne possde aucun fils, la primitive renvoie la valeur -1, o si le processus appelant possde des fils mais aucun fils zombi, le processus est alors bloqu jusqu' ce que l'un de ses fils devienne zombi. Exercice: A l'aide de cette nouvelle wait commande modifier votre programme afin que le pre termine aprs le fils quoiqu'il se produise dans la partie ``case'' du fils. Il existe aussi une autre primitive de mme genre qui s'appelle waitpid () qui permet un processus d'attendre un fils dont le PID est spcifi en paramtre. Signaux et fork Exercice: raliser un programme reposant sur les fork tel que le processus pre envoie un signal SIGUSR1 son processus fils aprs avoir test son existence. N'oubliez pas d'#include! Primitives du systme Il est possible depuis un programme C de demander l'excution d'une commande shell par un appel la fonction standard:
system (const char *chaine_commande);
Crez un tel programme qui lancera la commande nedit ou lancera le script top.
On cre un tube, ce tube fournit un mcanisme de communication unidirectionnel entre deux processus. Ainsi, une fois le tube cre entre deux processus, il sera possible un processus A d'crire une extrmit du tube tandis qu'un autre processus B pourra lire l'autre extrmit ce qui a t crit. Ainsi qu'on va le voir tout de suite, les tubes permettent une synchronisation entre deux processus: le processus B devant attendre par exemple que le processus A ait crit dans le tube. Les processus peuvent ouvrir et traiter les tubes de la mme manire que les fichiers. Cette ouverture se ralise par lappel systme pipe. Deux descripteurs de fichier sont retourns. Ces deux descripteurs reposent dans un vecteur dlments de type int. Le premier lment (indice 0) de ce vecteur sert lire le tube. Le deuxime lment (indice 1) sert y crire. Aprs un appel pipe, le processus peut crer un processus enfant hritant les deux descripteurs du tube. Il nest possible dutiliser un tube sans nom que lorsquun processus parent lgue son processus enfant laccs au tube. Les autres processus ne peuvent pratiquer lIPC (Inter Process Communication) de cette manire. Si nous avons deux processus qui souhaitent communiquer mais qui nont pas un parent commun, alors nous devons employer un autre type dIPC. La solution la plus simple consiste utiliser les tubes avec nom (named pipe), galement appels FIFO. Les tubes avec nom sont enregistrs dans le systme de fichier en tant que fichier et peuvent donc tre ouvert par un processus quelconque. Seuls comptent alors les droits daccs au tube. Les Pipes (tubes) Avec ltablissement dun pipe entre deux processus, la sortie du premier devient lentre du second. Le symbole | sert tablir ce pipe. Exemple : ls | pg (Ex : Ctrl-C interruption) Lappel systme pipe Lappel systme pipe est dfini de la manire suivante :
#include <unistd.h> int pipe (int fd_vk[2])
Si pipe ne parvient pas crer un tube, il retourne -1, 0 dans le cas contraire. Un tube demande un inode spcial qui ne correspond pas un nom dans le systme de fichiers. Cest la raison pour laquelle nous parlons de tubes sans nom (unnamed pipes). int pipe (int p[2]); cre un tube p : p[1] correspond au descripteur pour crire dans le tube et p[0] permettra de lire dans le tube. Si le tube a bien t cre, la valeur de retour de la fonction pipe sera 0, dans le cas contraire, la fonction renverra -1. Voici un programme qui illustre le fonctionnement des tubes:
#include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int p[2]; char ch[10]; /* buffer qui servira envoyer ou recevoir des donnes main() {
76 /84
if (pipe(p) == -1) { perror("Creation du tube"); exit(2);} printf("Ecrivons dans le tube"); write(p[1],"1234",4); /* 4 : longueur de ce qui est crit dans le pipe */ read(p[0],&ch,4); /* lire lau maximum 4 caractres dans le pipe */ printf("A l'autre extremite, chaine recue : %s",ch); }
Remarques: write(p[1],"1234",4); on lit/crit dans le tube des caractres ou chaines de caractres, read(p[0],&buf,TAILLE_BUF); correspond une demande de lecture d'au plus TAILLE_BUF caractres, write(p[0],buf,TAILLE_BUF); criture des TAILLE_BUF premiers caractres de buf. Travail demand: 1. Tester cet exemple. 2. Modifier le programme prcdent. Il s'agit d'utiliser la notion de pipe et de fork pour faire en sorte qu'un processus pre envoie son fils des informations, le fils affiche alors l'cran ce qu'il a reu. 3. Utiliser la notion de pipe et de fork pour faire en sorte que le jeu de morpion joue tout seul contre lui mme. On peut ainsi imaginer crer 2 processus: un processus pre, un processus fils. Ces deux processus joueront ensemble en s'informant mutuellement des coups jous par le biais de deux pipe. Attention aux phnomnes de blocage. En effet, un processus qui tente de lire dans un tube o rien ne se trouve sera bloqu jusqu' ce que des informations lire s'y trouvent...
77 /84
for (Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++) { signal (Nb_Sig,Traite_Sig); } while(1); /* Attendre des signaux */
void traite_alarme() { nombre=100; printf("Le nombre entr vaut:%d\n",nombre); printf("Veuillez entrer un AUTRE nombre:"); scanf ("%d",&nombre); printf("Le NOUVEAU nombre entr vaut:%d\n",nombre); } main() { alarm(3); signal(SIGALRM,traite_alarme); printf("Veuillez entrer un nombre:"); scanf ("%d",&nombre); printf("Le nombre entr vaut:%d\n",nombre); }
Exercice 2
#include <signal.h> #include <stdio.h> #include <unistd.h> int i='a'; int j;
void traite_alarme() { printf("caractre suivant: %c \n",i); i++; signal(SIGALRM,traite_alarme); if (i<='z') alarm(1); else exit(0); } main() { signal(SIGALRM,traite_alarme); alarm(1); while (1); }
Il suffit de rajouter la commande sleep 1 par exemple juste avant la case (pid_t)0: /* on est dans le processus fils */ printf("valeur de fork =%d ",pid); printf("je suis le processus %d de pre %d ",getpid(), getppid()); sleep 1 printf("fin du processus fils"); exit(0);Pour raliser la synchronisation avec la commande wait, rajouter les deux lignes en italique: #include <stdlib.h> #include <stdio.h> main() { pid_t pid; int status; switch(pid=fork()){ case (pid_t)-1: perror("Cration de processus"); exit(2); case (pid_t)0: /* on est dans le processus fils */ printf("valeur de fork =%d ",pid); printf("je suis le processus %d de pre %d ",getpid(), getppid()); sleep (1); printf("fin du processus fils"); exit(0); default: /* on est dans le processus pre */ printf("valeur de fork = %d ",pid); printf("je suis le processus %d de pre %d",getpid(), getppid()); wait(&status); printf("fin du processus pre"); } } Signaux et fork #include <stdio.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> main() { pid_t pid; int status; switch(pid=fork()){ case -1: perror("Cration de processus"); exit(2); break; case 0: /* processus fils bouclant*/
79 /84
while (1); break; default: /* on est dans le processus pre */ sleep(5); if (kill(pid,0)==-1) printf ("FILS %d inexistant\n",pid); else { printf (" envoi de SIGUSR1 au processus %d\n",pid); kill(pid,SIGUSR1); } } } Remarque Gnrale : Les exemples et les corrections des exercices ncessitent une vrification syntaxique lors de l'implmentation sur machine.
80 /84
Expansion des noms de fichiers o Ne pas confondre avec les caractres spciaux des expressions rgulires. Ne sont concernes que les chanes de caractres des noms de fichiers. o * remplace n'importe quelle chane de caractres
o o o o micro* microprocesseur micro-ordinateur microcosme ? remplace n'importe quel caractre m?cro micro macro
o o
[...] tablit une concidence avec l'un des caractres mis entre crochets m[ai]*
mail macro micro mini
[.-.] tablit une concidence avec tous les caractres compris entre les 2 bornes
ls [A-Z]*.[hc1-8] Prog.c Include.h Data.1 Text.6
HOME chemin d'accs au rpertoire initial de l'utilisateur PATH suite de chemins d'accs aux rpertoires des excutables PS1 invite principale du shell en mode interprteur PS2 invite secondaire du shell en mode programmation IFS sparateurs de champ des arguments MAIL chemin d'accs la bote aux lettres utilisateur MAILCHECK intervale en sec au bout duquel le mail est contrl CDPATH liste de chemins d'accs pour la commande cd ENV nom du fichier des variables d'environnement TERM nom du type de terminal
81 /84
$0 nom du script (pathname) $1, ..., $9 arguments (du 1er au 9me) $# nombre d'arguments $* liste de tous les arguments $@ liste de tous les arguments $? code retourn par la dernire commande $$ numro de processus de ce shell $! numro du dermier processus en arrire plan $- drapeaux fournis au shell par set
Variables utilisateur
Dclaration o variable=valeur Utilisation o variable2=$variable o variable2=${variable} Exportation o export variable o variable=valeur export variable (sh) o export variable=valeur (bash, zsh) Exemple
EXINIT='set nu ai ic' export EXINIT EXINIT='set nu ai ic' export EXINIT
Fichiers d'initialisation
/etc/profile .profile .login .cshrc .logout .bash_profile .bashrc .bash_alias .inputrc .zshrc .tcshrc
82 /84
Initialisation commune tous les login-shells o point de passage oblig pour tous les login o est remplac l'ENST par /usr/local/startup/profile o variables d'environnement trs longue dure de vie o fourni par le constructeur / adapt par l'administrateur o non modifiable par l'utilisateur Exemple
umask 027 USER=`lognam PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin:/usr/X11/bin MANPATH=/usr/local/man:/usr/man:/usr/lang/man MAIL=/usr/spool/mail/$USER HOSTNAME=`uname -n` OS=`uname -s` REL=`uname -r` OSREL=${OS}${REL} export USER PATH MANPATH MAIL HOSTNAME OS REL OSREL
.profile
Initialisation propre l'utilisateur o situ dans le HOME de l'utilisateur : ~/.profile o redfinition des variables proposes par /etc/profile o dfinition de nouvelles variables (var=valeur) o dtection si le shell est interactif ou non o excution ou non de scripts d'initialisation o configuration des paramtres du terminal (stty) o peut-tre "ressourc" (. ou source) . profile (sh, ksh, bash, zsh)
source .profile (bash)
Exemple
EDITOR=emacs VISUAL=emacs SUNADAHOME=/inf/lang/ada LC_CTYPE=iso_8859_1 EXPORT EDITOR VISUAL SUNADAHOME LC_CTYPE
83 /84
Spcificit des shells zsh et bash Initialisation propre l'utilisateur o situ dans le HOME de l'utilisateur : ~/.zshrc ~/.bashrc o redfinition du prompt PS1 o dfinition des aliases o dfinition de fonctions o peut-tre "ressourc" . ~/.bashrc ou source ~/.bashrc . ~/.zshrc ou source
~/.zshrc
Exemple
alias ls='ls -F' alias ll='ls -laF' alias a='alias' alias h='history' alias j='jobs -l' unalias=rm
.login : Fichier d'initialisation d'un login C-shell o interprt chaque login o dfinition de nouvelles variables o peut-tre "ressourc" par source .login .cshrc/.tcshrc : Fichier d'initialisation d'un Csh o rinterprt chaque invocation du csh/tcsh o dfinition des aliases (shells interactifs) o peut-tre "ressourc" par source .cshrc/.tcshrc .logout : Fichier de clture d'une session C-shell o effacement des fichiers temporaires, clear cran Exemple
setenv setenv setenv setenv EDITOR emacs VISUAL emacs SUNADAHOME /inf/lang/ada LC_CTYPE=iso_8859_1
84 /84