You are on page 1of 84

ENSI

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

ENSI/ Environnement Unix/ Septembre 2006

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

ENSI/ Environnement Unix/ Septembre 2006

3 /84

Chapitre 1 : Prsentation Gnrale du Systme Unix


1.1 Introduction
Le systme Unix a t mis au point par Ken Thompson dans les laboratoires Bell au New Jersey aux Etats-Unis. Le but de Ken Thompson tait de mettre au point un systme dexploitation interactif simple pour faire fonctionner un jeu qu'il avait cr (space travel, une simulation du systme solaire). La premire version de ce systme a vu le jour en 1969, il s'inspirait des principaux systmes d'exploitation de l'poque (Multics, Tenex), et tait destin une utilisation monoutilisateur, d'o son nom (Unix= Multix uni-utilisateur priori). Peu de temps aprs, D. Ritchie rejoint l'quipe de K. Thompson afin de mettre au point, en 1971, une version d'UNIX permettant la multiprogrammation. Paralllement, D. Ritchie participe grandement la dfinition du langage C (puisqu'il est considr comme un de ses crateurs avec B.W. Kernighan), ainsi l'ensemble du systme a t entirement rcrit en langage C en 1973. En 1975, partir de la version 6 du systme, Unix va tre commercialis. Lorsque le systme passe la version 7, l'volution s'accompagne de nombreuses modifications notables telles que la suppression du bridage li la taille des fichiers, une meilleure portabilit du langage et l'ajout de plusieurs utilitaires.

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.

1.2 Caractristiques dUNIX


Un systme dexploitation est un ensemble de programmes qui coordonnent le fonctionnement des diffrents composants matriels et logiciels dun systme informatique. UNIX est un systme dexploitation ayant les caractristiques suivantes: a) Multi-utilisateurs et Multitches: cela signifie que plusieurs utilisateurs peuvent accder simultanment au systme et excuter un ou plusieurs programmes; b) Temps partag: cest--dire que les ressources du processeur et du systme sont rparties entre les diffrents utilisateurs; c) Systme de fichiers hirarchique: plusieurs systmes de fichiers peuvent tre rattachs au systme de fichiers principal; chaque systme de fichiers possde ses propres rpertoires; d) Entres-Sorties intgres au systme de fichiers: les priphriques sont reprsents par des fichiers, ce qui rend le systme indpendant du matriel et en assure la portabilit; laccs aux priphriques est donc identique laccs aux fichiers ordinaires; e) Gestion de la mmoire virtuelle: un mcanisme dchange entre la RAM et le disque dur permet de pallier un manque de RAM et optimise le systme; f) Processus rentrants: les processus excutant le mme programme utilisent une seule copie de celui-ci en RAM; g) Interface utilisateur interactive (shell): elle est constitue dun programme spar du noyau permettant lutilisateur de choisir son environnement de travail. Elle intgre un langage de commandes trs sophistiqu (scripts).

1.3 Architecture dUNIX


Le systme Unix est constitu d'un systme d'exploitation (le noyau), d'un interprteur de commandes (shell) et de nombreux utilitaires (assembleur, compilateurs pour de nombreux langages, traitements de texte, messagerie lectronique, ...) Afin dassurer une certaine stabilit au systme, UNIX a t conu autour dune architecture en couche. Il y a trois couches fondamentales qui forment le systme: le noyau (Kernel); le shell (sh, Bshell, Kshell, Cshell); la couche de gestion des priphriques; la couche des processus utilisateurs.

ENSI/ Environnement Unix/ Septembre 2006

5 /84

Figure 1.2 : Architecture du systme Unix

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

1.4 Le langage shell


Sous le nom shell (coquille), on dsigne l'interface utilisateur qui, dans l'architecture d'UNIX, entoure le noyau (kernel). Plus simplement, le shell est un programme qui permet l'utilisateur de dialoguer avec le coeur du systme (le noyau). Il permet de raliser plusieur tches: a) il interprte les ordres taps au clavier par l'utilisateur et permet ainsi b) l'excution des programmes; c) il fournit l'utilisateur un langage de programmation interprt; d) il permet de modifier l'environnement; ENSI/ Environnement Unix/ Septembre 2006 6 /84

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

1.5 Les commandes


Le shell interprte la srie de caractres taps chaque fois qu'un retour chariot (return) est reu; en mme temps, les caractres taps sont affichs l'cran. Les premiers caractres taps jusqu'au premier sparateur (espace ou tabulation) sont interprts par le shell comme le nom de la commande excuter, les chanes de caractres suivantes tant considres comme les arguments. La syntaxe d'une commande UNIX est donc:
commande [argument(s)]

O:
commande est le nom d'une commande interne ou un programme excutable, et arguments sont des options reconnues par cette commande.

1.6 Les entres-sorties et leur redirection


Une commande lit normalement ses donnes d'entres partir de lentre standard (par dfaut le clavier) et crit sa sortie sur la sortie standard (par dfaut lcran). Les processus accdent ces priphriques comme s'ils accdaient des fichiers ordinaires, par le biais de handle (descripteurs de fichiers). Voici donc un rcapitulatif des priphriques, de leur association par dfaut, ainsi que des descripteurs de fichiers: Priphrique Association par dfaut Descripteur de fichier Clavier 0 Standard input buffer Ecran 1 Standard output Ecran 2 Standard output error Tableau 1.1: Priphriques d'Entres/Sorties

1.7 Notions de processus


Un processus est nimporte quel traitement, appelant un ou plusieurs programmes et produisant un rsultat. Une seule copie dun programme en mmoire peut tre utilise par plusieurs processus (rentrance); lorsque des utilisateurs crent des processus qui font appel aux mmes programmes, la distinction entre processus est faite par leur image, qui par dfinition est lensemble des lments ncessaires lexcution dun processus un instant donn (tat de la mmoire, des registres, des fichiers, dun processus). 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). 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). Un processus Unix peut prendre six tats diffrents: en cours (d'xcution par le processeur) --> O (n the processeur) actif (prt lexcution) ->R (unnable); ENSI/ Environnement Unix/ Septembre 2006 7 /84

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

1.8 La gestion des fichiers


L'exploitation de la mmoire de masse est ralise par des structures appeles systmes de fichiers (file systems), qui occupent un espace physique du support exprim en blocs de 1024 octets. Exemple : un disque de 100 Mo, abritant un systme de fichiers qui l'occupe entirement, est constitu d' peu prs 100 000 blocs. Les deux premiers blocs sont rservs par le systme. Le premier bloc est vide sauf s'il s'agit du systme de fichiers principal (bootable), qui dans ce cas contient un programme appel 'bootstrap' (il est charg en mmoire l'initialisation). Le second bloc, appel 'super bloc', contient les informations significatives concernant le systme de fichiers; un de ses rles tant tout moment de rpertorier l'occupation des blocs du systme de fichier, le noyau doit le modifier chaque modification ou cration de fichier. Pour des raisons d'optimisation, le noyau n'crit pas sur le disque mais modifie une image du super bloc charge en mmoire vive qui, certains moments dans la vie du systme (et notamment lors de l'arrt de la machine), est rcrite sur le disque. Dans le cas d'un arrt brutal du systme, au dmarrage suivant, le super bloc ne correspond plus l'occupation effective des blocs et l'utilitaire fsck (File System ChecK) s'avre ncessaire pour reconstituer le super bloc (ATTENTION: cette procdure ne fonctionne pas toujours !!!). Sous UNIX, toutes les donnes sont manipules l'image d'un fichier ordinaire. De ce fait, il existe plusieurs types de fichiers en fonction de leur utilisation. Les diffrents types sont: les fichiers rpertoires dont le contenu fait l'association entre le numro d'inode (numro unique reprsentant un fichier sur le systme de fichiers) et le nom du fichier; les fichiers ordinaires qui stockent les donnes et les programmes sans format particulier mais comme une suite doctets; les fichiers spciaux de type blocs ou caractres qui constituent une porte permettant de communiquer avec les priphriques de l'ordinateur (Exemple: le lecteur de disquettes = /dev/fd0); les pipes nomms et les liens symboliques. Le systme de fichiers est une structure logique qui permet de grer l'espace disque. En effet, si l'on veut stocker des fichiers (ou rpertoires) sur un disque, il faut prparer une ou plusieurs structures d'accueil. On retrouve ce procd sous DOS lorsque vous crez X partitions sur un disque dur (avec fdisk); il faut les formater (avec format) avant de pouvoir les utiliser. Sous UNIX, tous les systmes de fichiers utiliss viennent se "rattacher" (on dit se monter) sur le systme de fichiers principal (sur lequel on a boot), il y a hirarchisation des dossiers (ou rpertoires).

ENSI/ Environnement Unix/ Septembre 2006

8 /84

Figure 1.3: Hirarchisation du systme de fichiers Unix

1.9 Les droits d'accs aux fichiers et rpertoires


Pour tre admis l'exploitation du systme, il faut que vous possdiez un compte qui se compose d'un nom d'utilisateur et d'un mot de passe. Unix possde diffrents niveaux de scurit qui sont: le propritaire du fichier ou rpertoire (un rpertoire tant un fichier particulier), le groupe propritaire du fichier, et le reste des utilisateurs. Par dfaut, lors de la cration d'un fichier, son propritaire est la personne qui l'a cr, et le groupe propritaire est le groupe principal du crateur. un nom d'utilisateur (tout comme un nom de groupe), est associ un numro. Exemple : l'utilisateur root, a pour numro d'utilisateur (UID) 0. UNIX en tant que systme d'exploitation scuris gre des droits d'accs sur les fichiers. Il existe trois niveaux de scurit qui correspondent respectivement aux droits de l'utilisateur, du groupe, et des autres utilisateurs. chaque niveau de scurit, il est possible de dterminer un certain nombre d'autorisations: La lecture (R ou 4): pour un fichier, ce droit permet la lecture du fichier; alors que pour un rpertoire, il autorise l'utilisateur lister son contenu; L'criture (W ou 2): pour un fichier, il permet sa modification; alors que pour un rpertoire, il permet la cration et la suppression des fichiers du rpertoire (ATTENTION: cette permission est valable quels que soient les droits des fichiers); L'excution (X ou 1): pour un fichier, il autorise son excution; et pour un rpertoire, il permet de se positionner dessous.

ENSI/ Environnement Unix/ Septembre 2006

9 /84

Tableau 1.2 : Fichiers Rpertoires

Figure 1.4: Affichage des Droits d'accs Unix (commande ls -l)

1.10 Procdure de connexion Unix


Pour pouvoir utiliser la machine, il vous faut disposer d'un nom d'utilisateur et du mot de passe qui lui est associ. Ceci vient du fait que l'un des processus systme lanc au dmarrage de la machine, le ttymon, remplit cette fonction de contrle. Ce processus suit l'algorithme suivant: Demande de nom dutilisateur: Invite login: aprs que vous ayez entr un nom d'utilisateur, Demande de mot de passe: Invite password: le mot de passe entr, Le processus vrifie la cohrence des informations avec ses fichiers systmes (/etc/passwd et /etc/shadow). Si les informations sont correctes, ttymon termine son travail en invoquant le shell qui vous est associ (/bin/sh ou /bin/ksh ou /bin/bash). Votre shell charge aussitt ses variables spcifiques (LOGNAME, TTY, HOME, ...). Puis il excute les scripts de dmarrage nomms /etc/profile et $HOME/.profile qui initialisent, entre autres, les variables spcifiques l'utilisateur (certains shell excutent d'autres fichiers .bashrc pour /bin/bash).

ENSI/ Environnement Unix/ Septembre 2006

10 /84

1.11 Quelques Commandes Unix


Commande Unix ls cd cd .. mkdir rmdir cp mv rm passwd cat more man apropos lpr Description liste le contenu d'un rpertoire change de rpertoire rpertoire parent cre un nouveau rpertoire supprime un rpertoire copie de fichier dplacement de fichier supprime le fichier change le mot de passe de l'utilisateur affiche le contenu du fichier affiche le contenu du fichier avec des pauses aide sur la commande demande quivalent DOS dir cd cd md deltree copy, xcopy move del type type |more help

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

ENSI/ Environnement Unix/ Septembre 2006

11 /84

Chapitre 2 : Commande de Base du Systme Unix


Syntaxe Gnrale d'une Commande Unix La syntaxe gnrale des commandes Unix est la suivante:
commande -options paramtre1 ... paramtren

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

a2ps, mp, enscript, mise en page de listings


Ces commandes permettent de transformer un texte, usuellement un listing, en un document PostScript pour une meilleure mise en page. Il existe de nombreuses options, les plus classiques transforment un fichier texte en un fichier PostScript comportant deux colonnes, en mode paysage (anglais: landscape), soit tourn de 90 degrs. La sortie est ensuite stocke dans le fichier listing.ps (ou, suivant la configuration, directement l'imprimante avec a2ps si on n'utilise pas l'option -nP).
enscript -plisting.ps -2rh programme.c a2ps -nP programme.c > plisting.ps

alias, dfinition de synonymes de commandes


Elle permet la cration de raccourcis ou de synonymes de commandes qui existent par exemple sur d'autres systmes, par exemple : la commande dir est un synonyme pour ls lagF :
alias dir ls -lagF

awk, interprte de scripts


Cet interprte (on dit aussi abusivement interprteur) est surtout utilis pour la conversion de formats textuels (tables, tableaux) et pour l'extraction de donnes. Par exemple, on peut extraire la troisime colonne d'un tableau et sommer les deux dernires colonnes:
awk '{print $3 " " ($(NF-1) + $NF)}' < entree > sortie

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]

Permet dafficher le calendrier du mois ou de lanne

cat, affichage ininterrompu d'un fichier


Permet d'afficher sans interruption possible un fichier dont le nom est communiqu en paramtre. La commande more (voir section more) permet quant elle un affichage page par page. Une utilisation intressante de cette commande est pour concatner des fichiers. Par exemple, cat a b c d > tous cre un fichier tous contenant la concatnation (mise bout bout) des fichiers a d, grce une redirection.

cd, changement de rpertoire


La commande cd permet de se dplacer dans l'arborescence des rpertoires. Il y a trois cas intressants:
cd ..

revenir au rpertoire prcdent dans l'arborescence.


cd /

revenir la racine.
cd

revenir au rpertoire par dfaut de l'utilisateur, ~ ou $HOME.

chmod, changement des protections d'un fichier


Elle permet de modifier les attributs, ou protections, d'un fichier ou d'un rpertoire, seulement si vous en tes le crateur. Elle permet galement de protger vos donnes (voir section lim_acces). Son format est le suivant: chmod quoi fichiers. Le paramtre quoi carctrise le droit accorder et qui peut tre : r : lecture w : criture x : excution g : groupe du propritaire o : autres que le groupe du propritaire Par exemple:
chmod u+r .

autorise vous-mme lister le rpertoire courant (.)


chmod g+w bin

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

chmod 664 fichier

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.

crontab, oprations heures fixes


La commande crontab permet d'effectuer des oprations heures fixes, comme par exemple compresser des fichiers, mettre jour des informations, envoyer des messages. Son utilisation est trs complexe et son utilit trs minime pour des utilisateurs non expriments. On configure cette commande en lui donnant en entre standard un fichier de configuration contenant les commandes excuter ainsi que les spcifications temporelles (quand excuter). Il est conseill d'diter un fichier que l'on nomme par exemple crontab , afin d'viter de perdre sa configuration en cas de mauvaise manipulation. Ensuite, il suffit de taper la commande crontab < crontab pour changer la configuration. On peut entrer crontab -l pour connatre la configuration courante. La configuration dcrite lance tout le 8 du mois 3 heures 20 minutes du matin un script. Il faut savoir que souvent le shell utilis pour lancer les commandes spcifies est sh. On peut spcifier #!/bin/csh par exemple au dbut d'un script dont le nom est donn en paramtre pour changer d'interprte. Il ne faut pas oublier de spcifier les sentiers complets: l'environnement n'est probablement pas initialis parfaitement.

ENSI/ Environnement Unix/ Septembre 2006

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

df, disponibilit des systmes de fichiers


Celle-ci permet de connatre les systmes de fichier accessibles, leur point de montage dans l'arborescence, leur capacit et leur taux d'occupation. On peut spcifier un rpertoire en argument, par exemple df permet de connatre l'espace disponible sur le disque o se trouve le compte de l'utilisateur. En gnral, un pourcentage (de 5 10 %, configurable) de chaque systme de fichier est rserv root. Il est donc possible que le total ne corresponde pas.

diff, affichage des diffrences entre fichiers


Cette commande affiche les diffrences entre deux fichiers. Cela est parfois utilis par des utilitaires stockant des modifications incrmentales dans des sources ou textes sous leur contrle, permettant de retrouver des versions antrieures ou le travail plusieurs, comme avec RCS ou SCCS. La commande patch permet de retrouver le fichier modifi l'aide du rsultat de diff et du texte original.

du, usage disque


Cette commande permet de connatre l'espace disque utilis par un sous-rpertoire. L'unit dpend du systme (parfois 512 octets, parfois 1 Koctet, ou d'autres valeurs). Un paramtre trs souvent utilis est -s *, qui permet d'obtenir la taille de tous les objets du rpertoire courant (fichiers et rpertoires). emacs, uemacs, xemacs, nediteur pleine page multi-fonctions Emacs est un diteur VT100 offrant des possibilits de macros et de scripts ingales. Une description sommaire de cet diteur se trouve dans la section. xemacs version graphique de emacs uemacs, diteur pleine page simplifi Micro-emacs est un sous-ensemble de l'diteur Emacs. ne, diteur pleine page avec menus droulants Nice-Editor est un diteur ressemblant Emacs, part une caractristique intressante: il permet l'affichage de menus droulants sur un terminal VT100 ou similaire par simple pression de la touche PF1 ou quivalente. fg, processus en avant plan fg PID, met le processus de numro PID en avant plan.

find, recherche de fichiers


Cette commande permet de trouver des fichiers depuis une racine spcifie. Par exemple, la commande suivante affichera tous les fichiers ayant un t dans leur nom, et ceci dans tous les sous-rpertoires du rpertoire courant, y compris ce dernier:
find . -name '*t*' -print

Notez les guillemets qui empchent une interprtation de la regexp par le shell.

ENSI/ Environnement Unix/ Septembre 2006

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 {} \;

grep, recherche de motif dans un fichier


grep est une commande permettant de trouver rapidement et facilement des motifs (expressions rgulires) dans un ou plusieurs fichiers. Le nom grep vient de global regular expression print ou g/re/p une commande de l'diteur ligne ed qui a t transforme en un programme externe. Typiquement, pour trouver la chane Bonjour (diffrente de la chane bonjour si l'argument -i n'est pas spcifi) dans les fichiers du rpertoire courant, on crira : grep Bonjour *

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.

gzip, compression et dcompression de fichiers


Voir compress, ...

head, affichage des premires lignes d'un fichier


Avec cette commande on affiche les premires lignes d'un fichier. jobs, tches en arrire-plan
jobs affiche la liste des tches en arrire-plan.

kill, destruction d'un processus ou communication de signaux


Cette commande permet de dtruire un processus ou de lui transmettre des signaux (conditions exceptionnelles, comme par exemple le raccrochage du modem, un dlai dpass, etc.). Si le processus cible est le numro 5346,
kill 5346

Tente de dtruire le processus 5346


kill -9 5346

Force la destruction du processus 5346

ENSI/ Environnement Unix/ Septembre 2006

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

Tente de dtruire tous vos processus.


kill -9 -1

Force la destruction de tous vos processus. ln, lien symbolique vers un fichier
ln fichier1 fichier2

permet de crer un lien symbolique fichier2 du fichier fichier1.

lpq liste des documents en cours d'impression


Permet de connaitre la liste des documents dans la queue de l'imprimante par dfaut (lpq est Line Printer Queue). L'option -P permet d'ajouter le nom de l'imprimante:
lpq -P laser1

lpr envoit l'imprimante


Il existe principalement deux faons d'envoyer quelque chose l'imprimante. Soit on envoie un fichier toto, la commande est lpr toto ou lpr -Plaser1 toto si on veux spcifier l'imprimante (laser1 ici), Soit en utilisant une pipe pour afficher le rsultat d'une commande: ls /tmp | lpr imprime le contenu du rpertoire /tmp.

lprm retire un document de la queue d'impression


Lorsqu'un document t envoy l'impression, un numro l'identifiant lui est attribu. Im est possible de connatre ce numro l'aide de la commande lpq:
$lpq lphp is ready and printing Rank Owner Job active ricou 343

Files cours1.ps

Total Size 129096 bytes

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.

lpspr, mise en page de documents PostScript


Certains systmes UNIX (principalement OSF/1 et Solaris avec les imprimantes DEC ) offrent une commande permettant d'imprimer des documents en format PostScript recto-verso (option -K2) ou plusieurs pages par ct (par exemple -N2 pour deux pages par ct). Il suffit ensuite de transmettre via un pipe la commande d'impression proprement dite, soit :
pspr -K2 -N2 | lpr

Des variantes libres de cette commande existent, parmi elles citons pstops et psnup. ENSI/ Environnement Unix/ Septembre 2006 17 /84

ls, liste d'un rpertoire


Elle permet de lister le contenu d'un rpertoire. Beaucoup d'options sont disponibles, parmi elles, certaines sont intressantes:
ls -lag | more

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.

mkdir, cration d'un rpertoire


Cre des rpertoires. L'option -p permet de crer automatiquement toute une hirarchie. On peut donner comme argument un chemin complet crer. Les rpertoires dj existants dans ce chemin seront ignors.

more, affichage page par page d'un fichier


Permet d'afficher un fichier avec arrt chaque page, ainsi que d'autres fonctions spciales. On passe d'une page l'autre avec les touches ESPACE (page suivante) et b (page prcdente). On quitte avec q et on demande de l'aide avec h. Notez que certaines versions de cette commande (notamment la variante less) ont besoin d'un q final pour sortir du programme.

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

mv, dplacer, renomer un fichier ou rpertoire


Cette commande permet de dplacer (move) un fichier. La syntaxe est la suivante:
mv fichier1 fichier2 renome le fichier fichier1 en fichier2, mv fichier1 /tmp dplace le fichier fichier1 dans le rpertoire (dj existant) /tmp, mv repertoire1 repertoire2 renome le rpertoire repertoire1 en repertoire2.

nice, changement de priorit


La commande nice permet de diminuer la priorit d'un processus son lancement afin de ne pas gner les autres processus (it's nice, isn't it ?). ENSI/ Environnement Unix/ Septembre 2006 18 /84

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.

nroff, mise en page de manuels


Il arrive souvent que les documentations soient disponibles sous une forme non facilement visualisable: on le remarque l'extension numrique du fichier (p.ex. foo.1). On peut les transformer en un texte format l'aide de cette commande. Pour les manuels, on utilise une macro spcifique: nroff -man foo.1 > foo.txt. Cette commande produit un fichier foo.txt qui peut ensuite tre affich page par page avec more. On pourrait aussi utiliser un pipe la place de la redirection.

passwd, changement du mot de passe


Cette commande permet de changer de mot de passe (voir section mot_de_passe). Certaines restrictions seront imposes par le systme quant la longueur du mot de passe et son contenu pour diminuer les risques de piratage. L'ancien mot de passe est toujours demand. Il n'y a pas d'cho pendant les demandes de mot de passe.

pico, diteur pleine page simplifi


Cet diteur est trs simple utiliser et malgr cela relativement puissant. Il est disponible en standard sous environnement PINE (cet environnement permet de lire le mail et les news de faon similaire et intgre sous interface VT100), ou sparment.

ps, affichage les processus en cours


Les options de cette commande varient suivant les systmes UNIX. Pour avoir l'ensemble des processus tournant sur la machine, sous Linux je tape : ps -aux mais sous Solaris ou HP-UX il faut taper ps -edalf. Il est conseiller de se rfrer son manuel (man).

pwd, affichage du rpertoire courant


Elle permet d'afficher le rpertoire courant.

quota, information sur l'utilisation disque autorise


Lorsque l'espace disque devient limit, il se peut que l'administrateur dcide d'attribuer un quota tous les utilisateurs, n'autorisant qu'un certain nombre de fichiers et un volume maximum. Pour connatre votre quota actuel, il suffit de taper quota -v. Les valeurs sont en kilooctets, donc par exemple 10000 signifie 10 megaoctets. Si au login ( votre prochane connexion) le systme vous indique quelque chose ressemblant QUOTA EXCEEDED, vous devez supprimer des fichiers sinon vous risquez des pertes de donnes car toute tentative de

ENSI/ Environnement Unix/ Septembre 2006

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

rm, destruction d'un fichier


Permet de dtruire un fichier. rmdir permet quant elle de dtruire un rpertoire pralablement vid. Certaines options de ces commandes sont pratiques mais dangereuses, et ne sont donc pas dcrites ici, part les options suivantes:
rm -i fichier1 ... fichiern

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.

ENSI/ Environnement Unix/ Septembre 2006

20 /84

rmdir efface un rpertoire


Permet d'effacer un rpertoire vide (attention aux fichiers cachs, faire ls -a pour tre sr): rmdir rep efface le rpertoire rep.

z, rception d'un fichier via ZModem


On tape simplement rz et on configure son programme de terminal pour l'mission d'un fichier.

screen, gestionnaire de fentres virtuelles


Cet utilitaire permet d'ouvrir plusieurs fentres virtuelles sur un seul terminal. On passe d'un cran l'autre avec des squences de contrle. Il est possible, avec un simple terminal VT100 d'ouvrir jusqu' dix fentres indpendantes. Des fonctions spciales, comme la sauvegarde des entres sorties, sont possibles. On commence une session screen en tapant screen ou screen -r. La deuxime forme est employe quand on dsire continuer (anglais: to resume) une session dtache pralablement. Le mode de contrle s'obtient avec CTRL-A, puis un caractre de commande. Taper un chiffre dnote la fentre (de 0 9). Par exemple (en supposant que CTRL-A a dj t presse). Attention, les commandes sont sensibles la casse. ? Aide. c crer une nouvelle fentre. k dtruire de faon sauvage la fentre courante. Il est mieux de fermer le shell avec exit ou CTRL-D. 0 aller sur la fentre 0. H sauver/ne pas sauver la session en cours dans cette fentre dans un fichier screenlog.x, o x est le numro de la fentre. h copie d'cran dans fichier hardcopy.x. w liste des fentres. m contrle d'activit allum/teint.

sed, diteur de flots


Cet interprte permet de grer des flots de donnes en excutant des oprations de substitution. Par exemple, pour remplacer les noms de forum s de la notation pointe (rec.humor.funny ) en la notation UNIX de stockage interne (rec/humour/funny), on pourrait utiliser cette commande:
sed 'y%.%/%' < entree > sortie

ENSI/ Environnement Unix/ Septembre 2006

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.

stty, changement de modes du terminal


Cette commande est trs complexe mais galement trs puissante. Elle permet de redfinir des paramtres du terminal, comme par exemple la touche d'interruption intr (dfaut: CTRL-C), ou la touche d'effacement erase (dfaut: BACKSPACE) (voir section personnaliser_son_environnement). Dans le cas o la touche BACKSPACE n'a pas le comportement voulu il suffit donc de taper stty erase BACKSPACE.

sz, envoi d'un fichier via ZModem


Elle permet d'envoyer des fichiers via le protocole ZModem , en gnral travers un modem . On indique simplement le(s) nom(s) du (des) fichier(s) envoyer sur la ligne de commande. Si votre programme de terminal ne supporte pas ZModem, vous pouvez essayer XModem ou un protocole similaire. En dernier recours, la commande kermit permet d'utiliser le protocole kermit. Elle existe sur la plupart des systmes UNIX. Dans certains cas, il faut renommer le fichier avant l'envoi avec mv, pour que le nom de fichier soit compatible avec le systme de fichiers distant.

tail, affichage des dernires lignes d'un fichier


On peut afficher les dernires lignes d'un fichier ou afficher en continu les ajouts un fichier, ce qui peut tre trs utile pour surveiller un fichier de log (anglais: logfile), respectivement:
Tail nom_fichier tail -f nom_fichier

Dans ce dernier cas, on interrompt la commande avec CTRL-C.

tar, gestion d'archives portables


Cette commande permet de rassembler plusieurs fichiers en une seule archive. Il n'y a cependant aucune compression. On peut ensuite compresser le fichier rsultant avec gzip par exemple.
tar cvf - . | gzip -9 > truc.tar.gz

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.

ENSI/ Environnement Unix/ Septembre 2006

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.

top, prsente en temps rel l'activit de la machine


l'aide de top on peut surveiller l'activit des processus lancs sur la machine. Pour quitter top, tapez q.
uuencode, codage de fichiers binaires pour transmission via courrier lectronique

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.

w, who, who am i qui fait quoi ?


La commande w montre quelles sont les personnes connectes sur la machine et ce qu'elles font. La commande who est similaire mais moins riche en informations. La commande who am i donne le login.

wc, comptage du nombre de lignes, de mots ou de caractres d'un fichier


wc l mon_fichier

compte les lignes de mon_fichier. which


which commande ou fichier

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

ENSI/ Environnement Unix/ Septembre 2006

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

msdos, vfat Pour les fichiers MS-DOS. Iso9660 proc

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/

Montage du lecteur de CD-ROM :


mount -t iso9660 /dev/hdb /cdrom

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.

ENSI/ Environnement Unix/ Septembre 2006

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

ENSI/ Environnement Unix/ Septembre 2006

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

Remplace toutes les occurrences de foo par bar.


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

ENSI/ Environnement Unix/ Septembre 2006

26 /84

Chapitre 3 : Programmation Shell


1 Introduction Au del d'un simple interprteur de commande, le shell offre les caractristiques d'un langage de programmation. Les commandes peuvent tre regroups sous forme de scripts et elles peuvent faire appel : des variables; des oprations (modifiant le contenu des variables); des contrles (test dcisionnels, boucles). La suite du chapitre est valable en Bourne Shell (sh). 2 Les caractres gnriques Certains caractres ont une smantique particulire quelque soit le shell. ctrl d Dconnexion crtl s Arrt de l'affichage ctrl q Annule le ctrl s * Remplace tous les caractres (id dos) y compris le . ? Remplace un caractre. [...] Un des caractres, par numration ou plage. Exemple : [aA]* : Tous les fichiers commenant par a et A [a-f]* : Tous les fichiers commenant par a, b, c, d, e et f. [^...] Sauf les caractres. Exemple : [a-m^i] : Tous les fichiers commenant par une lettre de a m sauf i. # Commentaire $ Rfrence une variable. ; Enchane les commandes. & Excute en arrire plan (C-shell seulement). | Pipe : Communication entre deux commandes. '...' Chane de caractre. "..." Chane de caractre avec substitution des variables par leur contenu. `... ` Excute la squence puis la remplace par son rsultat. \ Annule la smantique d'un caractre spcial. (...) Excute la squence sous un autre shell (garde la matrise du shell actuel). {...} Squence excute dans le shell lui mme. Par convention, tous les fichiers dont le premier caractre est un . sont des fichiers systme. 3 Cration de script, fonction du shell Le script est un fichier texte possdant les droits d'excution (cf la commande chmod). Ce fichier devient alors une nouvelle commande. Ce fichier est saisie sous un diteur (vi en mode texte par exemple) et sera interprter par le shell. La premire ligne du script dfinit le shell utiliser pour excuter le script et des options d'excution. Sa syntaxe est la suivante:
#!/bin/<shell> exemple : #!/bin/sh <options>

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"

ENSI/ Environnement Unix/ Septembre 2006

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

des chanes de caractres; des expressions numriques. a) Les fichiers


test -option fichier

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

-eq -ne -lt -gt -le -ge

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

Remarque: ces tests peuvent tre imbriqus.

ENSI/ Environnement Unix/ Septembre 2006

30 /84

if C1 then C2 => C1 && C2 if ! C1 then C2 => C1 l l C2 Case: Choix multiples


case valeur in <motif 1>) <motif 2>) esac < liste commande 1> < liste commande 2> ;; ;;

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 :

for i in $@ do traite le paramtre i de la ligne de commande done

Boucle while
while liste-commandes do commandes done

ATTENTION : liste-commande renvoie 0 bien xcute: ici 0 = vrai.

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

ENSI/ Environnement Unix/ Septembre 2006

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

8 Aritmtique entire et logique


expr <exp1> | <exp2>

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

ENSI/ Environnement Unix/ Septembre 2006

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.

ENSI/ Environnement Unix/ Septembre 2006

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

ENSI/ Environnement Unix/ Septembre 2006

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.

ENSI/ Environnement Unix/ Septembre 2006

36 /84

Chapitre 4 : Les Filtres


4.1 Filtres
Un filtre est un programme qui ralise un traitement sur un flot de donnes en entres pour fournir un flot de donnes en sortie. Ce concept prend tout son intrt grce aux diffrentes formes que peuvent prendre les flots de donnes. En effet, lentre peut provenir dun fichier, de lentre standard, dune redirection, etc. De mme, la sortie peut tre un fichier, la sortie standard, une redirection, lentre dun tube, etc. On distinguer trois catgories de filtres: Des filtres simples ralisant un traitement lmentaire comme un tri; Des filtres simples utilisant en plus la notion dexpression rgulire pour caractriser des chanes de caractres; Des filtres programmables capables deffectuer diverses actions, comme lditeur de flots sed. Pour un filtre l'entre provient d'un fichier qui est, par dfaut, l'entre standard (le clavier). De mme le rsultat est crit sur un fichier qui est, par dfaut, la sortie standard (l'cran) (voir figure 3.1). Un filtre transforme les donnes prsentes son entre (et de dautres sources). Un filtre achemine les donnes transformes sa sortie standard (et vers dautres destinations). Un filtre affiche ses messages derreur vers la sortie erreur standard.

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.

ENSI/ Environnement Unix/ Septembre 2006

37 /84

Entre Standard

Filtre 1

Sortie standard

Tube

Filtre 2

Figure 3.2 : Utilisation des tubes avec les filtres Unix.


Les filtres sont particulirement intressants lorsqu'ils sont enchans l'aide de tubes. La figure 3.2 schmatise la commande compose : filtre1 | filtre2 Par exemple: ls | wc -w compte le nombre de fichiers dans le rpertoire courant (l'option -w (Words) spcifie le comptage de mots uniquement). Notons que, dans ce cas-l la premire commande (ls) n'est pas un filtre ce qui ne change rien au fonctionnement du tube.

4.1.1 Les mtacaractres


Les mtacaractres sont des caractres spciaux qui ont une signification particulire lors de traitement dune chane de caractres.

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

4.1.1.2 Les mtacaractres [ ]


Les mtacaractres [] permettent de dsigner des caractres compris dans un certain intervalle de valeur une position dtermine d'une chane de caractres. Par exemple [Ff]raise va identifier les chanes Fraise ou fraise, [a-z]toto va identifier une chane de caractre commenant par une lettre minuscule (intervalle de valeur de a z) et suvi de la chane toto (atoto, btoto, ...., ztoto). D'une manire plus gnrale voici comment [] peuvent tre utiliss: intervalle de A D (A, B, C, D), par exemple bof[A- D] [A- D] donne bofA, bofB, bofC, bofD intervalle de 2 5 (2, 3, 4, 5) par exemple 12[2-5]2 donne [2-5] 1222, 1232, 1242, 1252 intervalle de 2 5 et 6 (et non pas 56) (2, 3, 4, 5, 6) par [2-56] exemple 12[2-56]2 donne 1222, 1232, 1242, 1252, 1262 intervalle de a d et A D (a, b, c, d, A, B, C, D) par [a-dA-D] exemple z[a-dA-D]y donne zay, zby, zcy, zdy, zAy, zBy, zCy, zDy intervalle de 1 3 et - (1, 2, 3, -) par exemple [1-3-]3 donne [1-3-] 13, 23, 33, -3 intervalle de a c, I K et 1 3 (a, b, c, I, J, K, 1, 2, 3) [a-cI-K1-3] Tableau 3.1 : Cas d'utilisation des mtacaractres [] ENSI/ Environnement Unix/ Septembre 2006 38 /84

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.3 Les mtacaractres ^ et $


Le mtacaractre ^ identifie un dbut de ligne. Par exemple l'expression rgulire ^a va identifier les lignes commenant par le caractre a. Le mtacaractre $ identifie une fin de ligne. Par exemple l'expression rgulire a$ va identifier les lignes se terminant par le caractre a. L'expression rgulire ^chane$ identifie les lignes qui contiennent strictement la chane chane. L'expression rgulire ^$ identifie une ligne vide.

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.

4.1.1.5 Les mtacaractres \( \)


Pour le traitement complexe de fichier, il est utile parfois d'identifier un certain type de chane pour pouvoir s'en servir dans la suite du traitement comme un sous programme. C'est le principe des sous chanes, pour mmoriser une sous chane, on utilise la syntaxe \(expression rgulire)\, cette sous chane sera identifi par un chiffre compris par 1 et 9 (suivant l'ordre de dfinition). Par exemple \([a-z][a-z]*)\ est une sous chane identifiant les lignes contenant une ou plusieurs lettres minuscules, pour faire appel cette sous chane, on pourra utiliser \1. Voir dans le paragraphe sed pour un exemple.

4.1.2 Les expressions rgulires


Une expression rgulire (en anglais Regular Expression ou RE) sert identifier une chane de caractre rpondant un certain critre (par exemple chane contenant des lettres minuscules uniquement). L'avantage d'une expression rgulire est qu'avec une seule commande on peut raliser un grand nombre de tche qui seraient fastidieuses faire avec des commandes UNIX classiques. Les commandes ed, vi, ex, sed, awk, expr et grep utilisent les expressions rgulires. L'exemple le plus simple d'une expression rgulire est une chane de caractres quelconque toto par exemple. Cette simple expression rgulire va identifier la

ENSI/ Environnement Unix/ Septembre 2006

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

4.1.3 La commande tail


La commande tail affiche la dernire partie (par dfaut les 10 dernires lignes) de chacun des fichiers indiqus en paramtres. Si aucun fichier nest mentionn, la lecture se fera depuis lentre standard. La syntaxe est la suivante:

ENSI/ Environnement Unix/ Septembre 2006

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

4.1.4 La commande head


La commande head affiche le dbut du fichier pass en argument. Par dfaut, head affiche les dix premires lignes mais on peut prciser en option, un nombre quelconque de lignes. Cette commande ressemble la commande tail mais elle est plus limite au niveau des options.
head +10 mon-fichier #On obtient toutes les lignes du fichier de la 10eme jusqu'au dbut. head -10 mon-fichier # On obtient les 10 premires lignes partir du dbut.

4.1.5 La commande tee


Cette commande affiche lentre standard simultanment sur la sortie standard et sur le ou les fichiers passs en arguments
#affichage du contenu du rpertoire courant lcran et criture du contenu dans le fichier liste_fichiers User1@localhost > ls | tee liste_fichiers

4.1.6 La commande sort


La commande standard pour trier un fichier est sort qui permet galement de fusionner des fichiers et dliminer les lignes en double. Elle trie le ou les fichiers passs en argument ou dfaut lentre standard et affiche le rsultat sur la sortie standard. La syntaxe est la suivante:
Sort [-bmnru] [+pos1] [-pos2] [nom_fichier]

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

ENSI/ Environnement Unix/ Septembre 2006

41 /84

Exemple: soit le fichier carnet (nom:id:tel:ville)


mohamed:29:0298334432:Tunis mehdi:13:0466342233:Sfax ahmed:75:0144234452:Mahdia sana:92:0133444335:Sousse #tri sur le 1er caractre dans lordre alphabtique $ sort carnet ahmed:75:0144234452:Mahdia mehdi:13:0466342233:Sfax mohamed:29:0298334432:Tunis sana:92:0133444335:Sousse # tri sur le 2me champ $ sort -n -t : +1 -2 carnet mehdi:13:0466342233:Sfax mohamed:29:0298334432:Tunis ahmed:75:0144234452:Mahdia sana:92:0133444335:Sousse # tri par ordre alphabtique sur le 1er caractre sur le 4me champ pour les villes qui commencent par le mme caractre, le deuxime tri porte sur le prnom $ sort -t : +3 -4 +0 carnet ahmed:75:0144234452:Mahdia mehdi:13:0466342233:Sfax sana:92:0133444335:Sousse mohamed:29:0298334432:Tunis

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

ENSI/ Environnement Unix/ Septembre 2006

42 /84

mohAmEd:29:0298334432:Tunis sAnA:92:0133444335:Sousse

4.1.8 La commande find


La commande find parcourt les rpertoires depuis le rpertoire donn en paramtre la recherche de fichiers qui satisfont certains critres et pose sur ces fichiers des actions. Elle a donc la forme suivante :
find rpertoire critres actions rpertoire indique une sous hirarchie parcourir. A dfaut dune liste le rpertoire courant. critre exprime un critres de slection. Par dfaut une commande est excute si tous les

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

$ find . -name prog.c -print ./devoir1/prog.c ./projet/prog.c

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

Critre -atime n -ctime n -mtime n -name n -size n -user u -empty

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

ENSI/ Environnement Unix/ Septembre 2006

-print

Affiche les noms des fichiers.

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 {} \;

4.1.9 La commande grep


Cet utilitaire (General Regular Expression Parser, analyseur gnral d'expression rgulire) slectionne toutes les lignes qui satisfont une expression rgulire (ou rationnelle). 4.1.9.1 Syntaxe de la commande grep
grep [options] expreg [fichiers]

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

ENSI/ Environnement Unix/ Septembre 2006

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

contient une liste ou un intervalle de caractres cherchs [^..] caractres interdits.

ENSI/ Environnement Unix/ Septembre 2006

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

4.1.10 Les commandes cat et less


cat f1 f2 .. > f less f1 f2 .. > f concatne f1, f2 .. dans le nouveau fichier f concatne les fichiers f1 f2 .. en un seul fichier f (comme cat) 47 /84

ENSI/ Environnement Unix/ Septembre 2006

less f3 >> f

ajoute le contenu du fichier f3 la suite du contenu du fichier f

4.1.11 La commande cut: slection de colonnes


La commande cut prsente deux formes selon que l'on slectionne des colonnes de caractres ou qu'on distingue des champs spars par un caractre prcis. slection_colonne
cut -c(slection_colonnes) [fichiers]

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/

ngation de la question prcdente (revoir les rles ds options -c et -v)

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'

pour convertir et afficher la ligne saisie au clavier en minuscules


2. tr -c chaine car

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

supprime tout caractre entr, appartenant la chane chaine


5. echo $ligne | tr -d a-z

supprime toutes les minuscules non accentues


6. tr -s chaine

supprime toute rptition des caractres contenus dans chane


7. echo $ligne | tr -s ' '

supprime les espaces multiples entre les mots

4.1.14 Lutlitaire sed


Le programme sed est un diteur de flots avec la particularit dtre un diteur en ligne. Contrairement aux autres diteurs comme ed, ex et vi qui agissent sur un fichier en le modifiant directement, sed agit donc sur un fichier d'entre pour produire une version modifie dans un fichier de sortie distinct du fichier d'entre, le fichier d'entre n'tant jamais modifi lui-mme. Cette caractristique le rend trs utile dans les pipes et les scripts shell. 4.1.14.1 Prsentation sed est un diteur ligne non interactif, il lit les lignes d'un fichier (ou provenance de l'entre standard) une une et leur applique un certain nombre de commandes d'dition et renvoie les lignes rsultantes sur la sortie standard. Il ne modifie pas le fichier trait, il crit tout sur la sortie standard. Sed ne travaille pas sur une image du fichier en mmoire, son tampon ne contient qu'une ou quelques lignes du fichier un instant donn. Toutes les requtes que l'on fournit sed sont appliques chacune des lignes dfilant dans le tampon, en fonction de l'adressage de ces lignes dans les requtes. Un tampon auxiliaire permet les dplacements de blocs de texte dans le fichier.

ENSI/ Environnement Unix/ Septembre 2006

49 /84

Tampon d'dition (1 ligne)


Fichier diter

Tampon des requtes

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.

3.1.14.3 Commande de substitution

La commande s permet d'effectuer des substitutions suivant la syntaxe :


sed [adresse]s/expr-rgulire/remplacement/options

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

ENSI/ Environnement Unix/ Septembre 2006

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

4.1.14.4 Destruction ou slection

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

La commande peut tre :


a pour lajout, i pour linsertion, et c pour modification.

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.

ENSI/ Environnement Unix/ Septembre 2006

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.

ENSI/ Environnement Unix/ Septembre 2006

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

ENSI/ Environnement Unix/ Septembre 2006

53 /84

3.1.14.11 sed et les sous chanes Dans la commande:


sed -e "s/\([0-9][0-9]*\)/aa\1aa/" fichier

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.

4.1.15 L'utilitaire awk


Le nom awk vient de ses 3 auteurs Aho, Weinberger et Kernighan. Il peut tre class dans la catgorie des filtres. Mais c'est beaucoup plus qu'un utilitaire de gestion des fichiers textes, il intgre un langage interprt trs voisin du C. La version disponible sur Linux s'appelle gawk = GNU awk; il s'agit d'une version plus performante. C'est l'implmentation GNU du langage awk, petit langage interprt par le programme awk. La commande awk explore un ou plusieurs fichiers d'entre la recherche d'arrangements, il excute des actions sur les enregistrements (lignes) comportant ces arrangements. Ces arrangements et actions sont enchsss dans un programme. Les arrangements-actions ont la forme :
arrangement { action(s) }

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

La syntaxe est la suivante:


awk [-F<car>] {-f <fprog>|<prog>} {param][<fichier>]

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

ENSI/ Environnement Unix/ Septembre 2006

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

helene jean richard

56 32 25

ENSI/ Environnement Unix/ Septembre 2006

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

ENSI/ Environnement Unix/ Septembre 2006

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)

ENSI/ Environnement Unix/ Septembre 2006

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

ENSI/ Environnement Unix/ Septembre 2006

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)

Par exemple la commande :


awk -F":" '{ if ($3 >= 500 && substr( $1, 0, 1)== "j") print NR "login " $1 " uid = " $3 " rp perso : " $6}' /etc/passwd

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

4.2.1 Les pipes


D'une faon un peu semblable la redirection, le pipe (tuyau), aussi une abrviation de pipeline, permet de connecter ensemble plusieurs commandes, de faon ce que le fichier de sortie de l'une soit transmis comme fichier d'entre la suivante. Pour illustrer le fonctionnement du pipe, considrons l'exemple suivant :
$ ls | wc -w

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

ENSI/ Environnement Unix/ Septembre 2006

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.

4.2.2 L'aiguillage (tee)


La commande tee (lettre T, servant de mtaphore pour un source qui se double) permet de doubler un fichier pour le transmettre la fois en sortie et dans le fichier donn en paramtre. Ainsi, le pipeline de l'exemple prcdent, assorti de la commande tee, transmet la sortie la fois l'cran et dans le fichier MesGrosFichiers.
$ ls -l | awk '$5 > 10000 { print $9 }' | tee MesGrosFichiers

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

Pour plus d'information sur la commande more, lancez man more.

4.2.4 Utilisations pratiques des pipes


La combinaison de certaines commandes UNIX avec les programmes awk, grep et sed peut effectuer des traitements impressionnants qu'il faudrait souvent programmer dans d'autres environnements. 60 /84

ENSI/ Environnement Unix/ Septembre 2006

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 $

En ajoutant | sort la fin de cette commmande, les entres seraient tries :


$ ps -ef | grep rlogin | awk '{ printf ("%-8s %s\n", $1, $2) }' | sort

abcd02 11356 lavc01 1182 lavc01 1187 lavc01 11358 mnop04 11355 root 1183 wxyz01 11359 $

Considrons aussi l'exemple suivant :


$ cat *.html | sed 's/<.*>//g' > texte

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

ENSI/ Environnement Unix/ Septembre 2006

61 /84

Chapitre 5: Programmation du Noyau Unix


5.1 Le noyau Unix
Le noyau 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 du systme de fichiers. Le partage du temps processeur entre les processus actifs est gr par un processus systme appel 'scheduler', il est bas sur l'horloge de l'ordinateur. des intervalles rguliers (de l'ordre du 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 quel processus doit tre excut; les donnes propres chaque processus actifs (environnement, 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).

5.2 La gestion des fichiers et les entres/sorties de base


Le plus bas niveau des entres sorties consiste en des appels du systme d'exploitation. Un programme lit des fichiers par morceaux de taille arbitraire. Le noyau gre les donnes par blocs de taille compatible avec les caractristiques physiques des priphriques et il rparti les ressources entre les diffrents utilisateurs. Toute entre ou sortie est une lecture ou une criture d'un fichier, car tous les priphriques, et mme le terminal, sont des fichiers pour Unix. Cela signifie qu'une interface unique prend en charge les communications entre programme et son environnement. A ce niveau on trouve deux types d'appels au systme: d'une part quelques appels permettant de manipuler des fichiers (cration, suppression, etc.) et d'autre part des primitives permettant d'agir sur le contenu d'un fichier ou d'un i-nud (i-node).

5.2.1 Les i-noeuds


Un i-noeud est une structure de 64 octets contenant les champs dcrivant les proprits d'un fichier, y compris les moyens pour y accder. Un i-noeud est compose de: type de fichier nombre de liens UID (User Identification) numro d'utilisateur du propritaire GID (Group Identification) numro du groupe propritaire taille du fichier en octets adresses des blocs de donnes (qui contiennent le fichier) droits du fichier date du dernier accs date de dernire modification ENSI/ Environnement Unix/ Septembre 2006 62 /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); } }

5.2.2 Les systmes de fichiers


L'exploitation de la mmoire de masse est ralise par des structures appeles systmes de fichiers (file systems), qui occupent un espace physique du support exprim en blocs de 1024 octets. Exemple : un disque de 100 Mo, abritant un systme de fichiers qui l'occupe entirement, est constitu d' peu prs 100 000 blocs. Les deux premiers blocs sont rservs par le systme. Le premier bloc est vide sauf s'il s'agit du systme de fichiers principal (bootable), qui dans ce cas contient un programme appel 'bootstrap' (il est charg en mmoire l'initialisation). Le second bloc, appel 'super bloc', contient les informations significatives concernant le systme de fichiers; un de ses rles tant tout moment de rpertorier l'occupation des blocs du systme de fichier, le noyau doit le modifier chaque modification ou cration de fichier. Pour des raisons d'optimisation, le noyau n'crit pas sur le disque mais modifie une image du super bloc charge en mmoire vive qui, certains moments dans la vie du systme (et notamment lors de l'arrt de la machine), est rcrite sur le disque. Dans le cas d'un arrt brutal du systme, au dmarrage suivant, le super bloc ne correspond plus l'occupation effective des blocs et l'utilitaire fsck (File System ChecK) s'avre ncessaire pour reconstituer le super bloc (ATTENTION : cette procdure ne fonctionne pas toujours !!!). Structure d'un file system (1 bloc=1024) Contenu "bootstrap" pour une partition principale sinon vide Super bloc

N Bloc 0 1

ENSI/ Environnement Unix/ Septembre 2006

64 /84

2N N+1 M De M+1 95% du FS Les 5% restants

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

5.2.3 Descripteurs des fichiers


Dans le cas gnral, avant d'entreprendre une opration de lecture ou d'criture, il est ncessaire d'informer le systme: il s'agit de l'ouverture du fichier dans le cas dun accs en lecture, dans le cas d'une criture il est ncessaire de crer le fichier, sil nexiste pas. Le systme vrifie vos droits rliser de telles oprations, et, si tout est correct, retourne un entier non nul, appel descripteur de fichier (ou nom local). Chaque fois qu'une opration ENSI/ Environnement Unix/ Septembre 2006 65 /84

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.2.4 Les E/S sur fichier


Les principales oprations d'E/S de base sont creat, open, read, write, unlink et close. A la cration il faut spcifier les droits d'accs au fichier et lors de l'ouverture il faut prciser le mode (0: lecture, 1: criture et 2: lecture/criture). Le tableau 4.3 prsente en dtail les diffrentes fonctions qui peuvent tre utilises en C.

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

ENSI/ Environnement Unix/ Septembre 2006

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.

ENSI/ Environnement Unix/ Septembre 2006

67 /84

5.4 Les signaux sous UNIX


Un signal est un vnement, interne ou externe, qui interrompt le droulement normal d'un processus. Cette interruption a lieu en gnrale, quand le processus passe du mode noyau au mode utilisateur. On dit que le signal est dlivr. Un signal peut tre: o Un caractre venant du terminal comme ^|, ^C, ^S, ^Q etc. reprsents respectivement par des constantes symbolique SIGQUIT, SIGINT, SIGSTOP, SIGCONT,Ces caractres sont visibles par la commande stty a e modifiable par la commande stty applique quit, intr, cont, stop, etc. (exemple: stty intr ^I). Les signaux du terminal ne concernant que les processus courants et non ceux qui sont en backgroud. o D une erreur programme (signaux internes) comme la violation mmoire (SIGEGV) ou la division par 0 (SIGFPE). o Emis par un autre programme avec la primitive kill (). C'est par exemple ce qu'envoie le shell de lancement quand on tape la commande "kill sig pid" au processus dsign.

5.4.1 Prsentation des signaux


Chaque signal a un sens et possde un numro symbolis par une constante qui commence par ``SIG''. Leur liste se trouve dans /usr/include/signal.h dont voici un extrait.
Nom Signal SIGFPE SIGKILL SIGINT SIGUSR1 SIGUSR2 SIGSTP SIGCONT SIGHUP Numro 8 9 2 16 17 18 19 1 Description une erreur arithmtique est survenue (floating exception). signal de terminaison. Le processus qui reoit ce signal doit se terminer immdiatement. frappe du caractre int sur le clavier du terminal: (CTRL + C). signaux qui peuvent tre mis par un processus utilisateur pour faire communiquer des processus. frappe du caractre de suspension sur le clavier: (le fameux CTRL +Z). signal de continuation d'un processus stopp: lorsque vous tapez bg aprs avoir fait un CTRL +Z lorsque vous vous loggez, un processus vous concernant est cre; les autres processus qui sont cres ensuite dpendent de celui-ci. Une fois que le processus leader de votre session est termin (par un logout par exemple), le message SIGHUP est envoy tous ses fils qui vont se terminer leur tour Erreur sur bus Evnement dclench par l'horloge pour signaler l'expiration d'un dlai Emis en cas de problme matriel Emis en cas d'instruction illgale Abandon, lorsque le caractre <QUIT> est frapp.

SIGBUS SIGALARM SIGIOT SIGILL SIGQUIT

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

5.4.2 L'envoi de signaux


En shell: kill En langage C: -num_du_signal num_du_processus

ENSI/ Environnement Unix/ Septembre 2006

68 /84

#include <signal.h> int kill (pid_t pid, int sig);

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

5.4.3 Le traitement des signaux


Le destinataire du signal peut excuter une fonction la rception d'un signal donn. Ainsi, un appel signal (num_du_signal, fonction) rcupre un signal de numro num_du_signal. Remarque: sur les UNIX de la famille Berkeley, par exemple Solaris de Sun, aprs excution de la fonction spcifique dfinie par l'utilisateur, l'option par dfaut est rtablie. Si on veut conserver l'option spcifique il faut rappeler signal (num_sig, fonction) dans fonction. Voici un exemple que vous pouvez tester en: lanant le programme puis en pressant sur (CTRL + C), supprimant la ligne : /* ligne 1 */ et retester le programme pour bien comprendre la remarque.
#include <signal.h> void trait_sig_int () { printf("Bien reu SIGINT, mais je m'en moque \n"); signal (SIGINT,trait_sig_int); /* ligne 1 */ } main () { signal (SIGINT,trait_sig_int); while (1); }

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 :

Affiche son numro (pid) via l'appel getpid (), 69 /84

ENSI/ Environnement Unix/ Septembre 2006

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.

5.4.4 La primitive alarm


unsigned int alarm (unsigned int secondes) demande au systme d'envoyer au processus courant le signal SIGALRM aprs la dure en secondes. Le comportement du processus la rception du signal SIGALRM est le suivant: if secondes=0 then annuler la demande antrieure ; if handler associ SIGALRM non dfini then terminer le processus. Exercice 1 : Ecrire un programme alarm qui demande l'utilisateur de taper un nombre. Afin de ne pas attendre indfiniment, vous utiliserez le signal SIGALRM pour que le programme ne soit pas bloqu plus de 5 secondes. Solution #include <signal.h> #include <stdio.h> #include <unistd.h> /* pour la fonction alarm */ ... Exercice 2 : crire un programme qui affiche la succession des lettres de l'alphabet de telle sorte qu'une nouvelle lettre apparaisse toutes les secondes.

5.5 Les Processus


Un processus est un programme en cours d'excution ou encore nimporte quel traitement, appelant un ou plusieurs programmes et produisant un rsultat. Une seule copie dun programme en mmoire peut tre utilise par plusieurs processus (rentrance) ; lorsque des utilisateurs crent des processus qui font appel aux mmes programmes, la distinction entre processus est faite par leur image, qui par dfinition est lensemble des lments ncessaires lexcution dun processus un instant donn (tat de la mmoire, des registres, des fichiers, dun processus). Plus prcisment, un processus est l'image tout instant de l'tat d'avancement d'un programme en cours d'excution. Cette image est constitue du code de programme, de la zone de donnes (statique, dynamique et pile) et d'un ensemble d'autres informations (bloc de contrle du processus) dont le systme a besoin pour contrler le bon droulement du processus et qui constituent son contexte d'excution. On y trouve souvent les valeurs des registres, en particulier le compteur ordinal (CO), les liens avec l'utilisateur et le systme d'E/S, terminal de lancement, descripteurs des fichiers ouverts, liste des signaux possibles, etc.

ENSI/ Environnement Unix/ Septembre 2006

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

5.5.1 Les tats d'un processus


Un processus peut prendre six tats diffrents : actif (en cours d'xcution par le processeur) --> O(n the processeur) prt ( lexcution) ->R(unnable); endormi (en attente) ->S(leeping); invalide (en attente de mmoire) ->X (SXBRK); nouveau ou 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 la commande ps el. Lorsquun processus est actif, il a le contrle du processeur 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 !). Nous venons de voir que les entres et sorties dun processus pouvaient tres dtournes vers des fichiers ; mais puisque plusieurs processus peuvent sexcuter en mme temps, il pourrait tre utile de rediriger ces sorties vers lentre dautres processus, ou plus ENSI/ Environnement Unix/ Septembre 2006 71 /84

gnralement dchanger des donnes entre processus. Les mcanismes suivants sont mis en place cet effet:

La commande ps affiche la liste de vos processus en cours.

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.

5.5.2 Priorit d'un processus


Chaque processus se voit affecter une priorit qui correspond un numro. Lorsqu'une commande est lance, le processus a une priorit maximale. Plus le processus occupe de temps d'excution pour le processeur, plus son numro de priorit baisse, et moins le processus occupe de temps d'excution pour le processeur, plus son numro de priorit augmente. Ainsi, plusieurs processus peuvent tre excuts en mme temps. La commande nice permet de diminuer la priorit du processus (pour les commandes longues et peu urgentes, par exemple). Le paramtre spcifi aprs l'option -n est un nombre compris entre 0 et 20 qui indique le facteur de diminution : nice -n 20 find / -type f -name "install*" -print L'administrateur systme (compte root) peut galement augmenter la priorit avec un nombre ngatif : nice -n -20 find / -type f -name "install*" -print La commande renice permet de changer le facteur de priorit en cours d'excution de la commande, en spcifiant le nouveau facteur de priorit et le numro de processus : renice 10 733 Le super utilisateur est inform du changement : 733: old priority 19, new priority 10 ENSI/ Environnement Unix/ Septembre 2006 72 /84

5.6 La cration de processus


La primitive fork Afin de crer des applications plus volues reposant sur le systme d'exploitation, il est plus facile d'crire un programme en C qui ralise ventuellement des appels systme. La primitive fork permet la cration dynamique d'un nouveau processus qui s'excute de faon concurrente avec le processus qui l'a cre. Tout processus UNIX, except le processus originel (de numro 0), est cre par un appel cette primitive. Afin de bien comprendre le fonctionnement de la primitive fork; tapez l'exemple suivant dans le fichier prog.c et excutez le.
#include <stdlib.h> #include <stdio.h> main() { pid_t pid; switch(pid=fork()){ case -1: perror("Cration de processus"); exit(2); case 0: /* on est dans le processus fils */ printf("FILS valeur de fork =%d ",pid); printf("FILS je suis le processus %d de pre %d",getpid(), getppid()); printf("FILS fin du processus fils"); exit(0); default: /* on est dans le processus pre */ printf("PERE valeur de fork = %d ",pid); printf("PERE je suis le processus %d de pre %d",getpid(), getppid()); printf("PERE fin du processus pre"); } }

ENSI/ Environnement Unix/ Septembre 2006

73 /84

Actif Utilisateur

Mode Utilisateur

Nouveau

Prt

Actif Noyau

Zombi

Endormi

Mode Noyan en mmoire

Prt swap

Endormi swap

Mode swap

Appels systmes ou interruption

Excution en mode utilisateur 1


retour retour

Excution en mode noyau exit

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.

ENSI/ Environnement Unix/ Septembre 2006

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.

5.7 Synchronisation du pre et du fils


Etant donn que le processus pre et le processus fils se droulent de manire concurrente, il se peut trs bien que le fils termine son excution avant celle du pre. 1) Modifier le prcdent programme en introduisant une temporisation afin que le fils termine aprs le pre quoi qu'il arrive. 2) A prsent, on souhaite que quoi qu'il advienne, le processus pre doit finir aprs le fils tout en conservant la temporisation qui se trouve dans le ``case'' du fils. Pour ce faire, nous allons utiliser la primitive wait ():
pid_t wait(int *pointeur_status); pid_t est un type qui assure la portabilit

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.

5.8 Les tubes


5.8.1 Introduction
Les tubes ordinaires (ou non nomms) constituent un mcanisme permettant des processus de communiquer des informations d'un volume significatif. Le principe est le suivant: ENSI/ Environnement Unix/ Septembre 2006 75 /84

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() {

ENSI/ Environnement Unix/ Septembre 2006

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

5.8.2 Les piles FIFO (First In First Out) ou pipes nomms


Ils agissent comme les pipes ordinaires, la diffrence tant quils ont une entre dans un rpertoire et peuvent tre utiliss par des processus indpendants.

5.8.3 Les vnements


Le systme annonce au processus actif larrive dun vnement; cela peut tre utilis soit pour dclencher (arrter) un processus, soit pour synchroniser lexcution de plusieurs processus. Lutilisateur peut introduire des vnements laide de la commande kill ; certaines touches de contrle sont normalement associes des vnements (Ctrl-C, Ctrl-D).

5.9 Solutions des exercices


Les signaux sous Unix
#include <signal.h> void Traite_Sig (int Numero) { printf("Coucou, recu signal %d ! mais je l'ignore !\n", Numero); signal (Numero,Traite_Sig); /* !!!!!!!!! */ } main() { int Nb_Sig ;

ENSI/ Environnement Unix/ Septembre 2006

77 /84

for (Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++) { signal (Nb_Sig,Traite_Sig); } while(1); /* Attendre des signaux */

} La fonction alarm Exercice 1


#include <signal.h> #include <stdio.h> #include <unistd.h> int nombre; /* pour la fonction alarm */

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;

/* pour la fonction alarm */

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); }

Synchronisation du pre et du fils ENSI/ Environnement Unix/ Septembre 2006 78 /84

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*/

ENSI/ Environnement Unix/ Septembre 2006

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.

ENSI/ Environnement Unix/ Septembre 2006

80 /84

ANNEXE: Les variables Unix


Mta-caractres d'expansion

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

{...,...} remplace successivement les chanes intrieures


ls *.{C,cc}

~ remplace par le $HOME ou celui d'un autre login (csh, bash).


cd ~username

Variables d'environnement prdfinies


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

ENSI/ Environnement Unix/ Septembre 2006

81 /84

Variables de substitution prdfinies


$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

ENSI/ Environnement Unix/ Septembre 2006

82 /84

/etc/profile (sous System V uniquement)

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

ENSI/ Environnement Unix/ Septembre 2006

83 /84

.zshrc, .bashrc (en zsh ou bash)


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, .cshrc, .tcshrc, .logout (en csh ou tcsh)

.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

ENSI/ Environnement Unix/ Septembre 2006

84 /84

You might also like