guide korn shell - fr

Upload: cisco213

Post on 10-Apr-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/8/2019 Guide Korn Shell - FR

    1/240

    GUIDEdu

    KornShellsous

    UNIX(HP-UX 8.0, SUNOS 5.1, AIX 3.2)

    Jean Franois Pujol

    aot 93

    jh Soulier

  • 8/8/2019 Guide Korn Shell - FR

    2/240

    page 2 - Guide du KornShell sous UNIX

    jfpujol,18aot1993

  • 8/8/2019 Guide Korn Shell - FR

    3/240

    Guide du KornShell sous UNIX - page 3

    jfpujol,

    18a

    ot1993

    INTRODUCTION

    Ce document constitue une aide la programmation du KornShell (ksh), et non un manuel de

    rfrence; cest pourquoi il est destin aux utilisateurs ayant dj des connaissances de base dunshell (sh ou csh).

    Il contient des exemples qui se veulent instructifs, et pas une base rigide de programmation :vous y piocherez donc ce qui vous semble bon.

    Tous les exemples ont t excuts lorigine sur un hp9000 srie 400, sous HP-UX 8.0, avecune version du KornShell date du 16/11/88.

    La version HP-UX 9.0 na apport que de lgres modifications au niveau des commandes(convergence vers POSIX 1003.2), mais na pas t teste ici spcifiquement. Dans le cas o une

    incompatibilit apparatrait, le mieux est de se rfrer aux spcificits SUN ou IBM: il est probableque lune dentre elles permette de comprendre le phnomne. Il faut savoir que HP fournit le shellPOSIX (appel sh, comme le BourneShell) partir de la version 9.0, et que le shell POSIX estpresque une copie conforme du KornShell.

    Pour tenir compte des utilisateurs travaillant sous SUN-OS 5.X (SOLARIS 2.X), ou AIX 3.2,les exemples ont t tests galement dans ces environnements, et les diffrences qui apparaissentpar rapport la version HP-UX figurent en annexe.

    Pour SUN-OS 5.1, la plate-forme tait une "SparcStation 1+", et pour AIX 3.2, une stationRS6000 modle 340, avec un clavier (et des messages) en version franaise.

    Dans la suite du document, un symbole dans la colonne signifiera que lexemple encours nest pas directement adaptable dans lenvironnement SUN-OS: il faudra se reporter auchapitre adquat pour y retrouver les particularits;

    De la mme faon, un symbole correspondra une remarque spcifique AIX.

    Le fait que la version de base soit crite pour HP-UX nest en rien li une quelconque normeou rfrence: le choix est arbitraire.

    Surtout, nhsitez pas me communiquer vos remarques : cela me permettra de corriger lesimperfections, qui, je nen doute pas, doivent encore mailler ce document.

    vo r

    voir

  • 8/8/2019 Guide Korn Shell - FR

    4/240

    page 4 - Guide du KornShell sous UNIX

    jfpujol,18aot1993

  • 8/8/2019 Guide Korn Shell - FR

    5/240

    Guide du KornShell sous UNIX - page 5

    jfpujol,

    18a

    ot1993

    Guide dutilisation du guide

    tes vous press(e)?

    essayez de trouver unesolution votre problmeparmi les cas types oules messages derreur

    courants

    est - cesuffisant?

    un renvoi vous indiqueo trouver desinformations

    supplmentaires

    bye

    tes - vouscompltementdsoeuvr(e)?

    lisez tout

    commencez par vousintresser la

    manipulation desfichiers, aux redirections,

    la manire dcrire unprogramme shell propre

    aux droits daccs,

    ouinon

    ouinon

    nonoui

  • 8/8/2019 Guide Korn Shell - FR

    6/240

    page 6 - Guide du KornShell sous UNIX

    jfpujol,18aot1993

  • 8/8/2019 Guide Korn Shell - FR

    7/240

    Table des matires

    Guide du KornShell sous UNIX - page 7

    jfpujo

    l,

    18a

    ot1993

    Table des Matires

    INTRODUCTION .....................................................................................................3

    Guide dutilisation du guide ......................................................................................5

    Table des Matires .....................................................................................................7

    I. Description ...........................................................................................13

    I.1. Introduction : quest ce que le shell? .............................................................14I.1.1. Description ....................................................................................................................14

    I.1.2. Algorithme simplifi ....................................................................................................14

    I.1.3. Les diffrents shells disponibles ...................................................................................15

    I.2. Quest ce quun processus UNIX ? ...............................................................16

    I.3. Format dune commande UNIX lmentaire ................................................17I.3.1. Description ....................................................................................................................17

    I.3.2. Exemples ......................................................................................................................17

    I.4. Les entres-sorties dune commande UNIX lmentaire .............................. 19

    I.5. La manipulation des fichiers .........................................................................21I.5.1. Description ....................................................................................................................21

    I.5.2. Exemple ........................................................................................................................21

    I.5.3. Les droits et la manipulation des fichiers .....................................................................23

    I.5.4. Les liens ........................................................................................................................271.5.4.1. Les liens physiques ...............................................................................................................................27

    1.5.4.2. Les liens symboliques ..........................................................................................................................31

    I.6. Interprtation dune commande shell ............................................................34I.6.1. Etape 1 : Interprtation des sparateurs .......................................................................34

    I.6.2. Etape 2 : Le caractre spcial quote ........................................................................35

    I.6.3. Etape 3 : Les variables et le caractre spcial anti-quote ou $() .................................351.6.3.1. Etape 3.1 : Les variables .....................................................................................................................35

    1.6.3.2. Etape 3.2 : Le caractre spcial anti-quote ou $( ) ...........................................................................41

    I.6.4. Etape 4 : Le caractre spcial double-quote " ............................................................42

    I.6.5. Etape 5 : Les caractres spciaux * [] ? ~ \ ................................................................43I.6.6. Etape 6 : les squences () et {} ...................................................................................46

    I.6.7. Etape 7 : Les caractres spciaux ; | && & | ..........................................................47

  • 8/8/2019 Guide Korn Shell - FR

    8/240

    page 8 - Guide du KornShell sous UNIX

    Table des matires

    jfpujol,

    18aot1993

    1.6.7.1. caractre ; ..............................................................................................................................................47

    1.6.7.2. squence || .............................................................................................................................................47

    1.6.7.3. squence && ........................................................................................................................................48

    1.6.7.4. caractre & ............................................................................................................................................481.6.7.5. le caractre | ou pipe ..........................................................................................................................48

    I.6.8. Etape 8 : Les redirections ............................................................................................49

    I.6.9. Etape 9 : La localisation de la commande ..................................................................551.6.9.1. Les alias ................................................................................................................................................55

    1.6.9.2. Les fonctions .........................................................................................................................................55

    1.6.9.3. Le path ..................................................................................................................................................58

    I.7. Le contrle des processus ............................................................................. 60I.7.1. La commande ps ...........................................................................................................60

    I.7.2. Le contrle des processus par le clavier .......................................................................61

    I.7.3. La commande jobs ........................................................................................................62I.7.4. Les commandes fg et bg ...............................................................................................63

    I.7.5. La commande kill .........................................................................................................65

    II. Les Expressions ...................................................................................69

    II.1. Les expressions du KornShell ..................................................................... 70II.1.1. Lexpression arithmtique ...........................................................................................70

    II.1.2. Lexpression gnrique ................................................................................................70II.1.3. Lexpression conditionnelle ........................................................................................71

    II.2. Les expressions rgulires ........................................................................... 76II.2.1. Expressions rgulires de base ( ER ) .........................................................................76

    II.2.2. Expressions rgulires tendues ( ERE ) .....................................................................79

    III. Exemples dutilisation de commandes ...............................................81

    III.1. Quelques fonctions du KornShell .............................................................. 82III.1.1. cd, pwd .......................................................................................................................82

    III.1.2. if .................................................................................................................................82

    III.1.3. for ...............................................................................................................................83

    III.1.4. la commande point . ................................................................................................83

    III.1.5. print ............................................................................................................................84

    III.1.6. set ...............................................................................................................................85

    III.1.7. shift .............................................................................................................................86

    III.1.8. trap ..............................................................................................................................86

    III.1.9. typeset .........................................................................................................................89III.1.10. unset .........................................................................................................................92

    III.1.11. wait ...........................................................................................................................92

  • 8/8/2019 Guide Korn Shell - FR

    9/240

    Table des matires

    Guide du KornShell sous UNIX - page 9

    jfpujo

    l,

    18a

    ot1993

    III.1.12. whence .....................................................................................................................93

    III.1.13. while .........................................................................................................................93

    III.2. Quelques commandes UNIX ...................................................................... 94III.2.1. awk .............................................................................................................................94

    III.2.2. basename, dirname ...................................................................................................109

    III.2.3. bs ..............................................................................................................................109

    III.2.4. dc ..............................................................................................................................111

    III.2.5. file ............................................................................................................................112

    III.2.6. find ...........................................................................................................................113

    III.2.7. grep ..........................................................................................................................115

    III.2.8. head ..........................................................................................................................116

    III.2.9. join ...........................................................................................................................116III.2.10. nohup ......................................................................................................................118

    III.2.11. sed ..........................................................................................................................119

    III.2.12. sort ..........................................................................................................................126

    III.2.13. strings .....................................................................................................................132

    III.2.14. tail ..........................................................................................................................134

    III.2.15. uniq ........................................................................................................................134

    III.2.16. xargs .......................................................................................................................136

    IV. Cas types ..........................................................................................143

    IV.1. Cas types dans un programme shell ......................................................... 144IV.1.1. Comment affecter une variable avec le rsultat dune commande? ........................144

    IV.1.2. Comment lire un fichier ligne ligne? ....................................................................145

    IV.1.3. Comment mettre une trace dexcution? .................................................................145

    IV.1.4. Comment tester si un fichier existe? sil est vide? ..................................................146

    IV.1.5. Comment excuter une commande sur plusieurs fichiers de mon rpertoire? ........147

    IV.1.6. Comment additionner ou multiplier deux entiers? ..................................................147

    IV.1.7. Comment transformer le contenu dune variable en majuscules? en minuscules? .148

    IV.1.8. Comment contraindre une variable une longueur donne? ...................................148

    IV.1.9. Comment lancer mes propres commandes sans tre oblig de spcifier leur chemin ab-solu? .....................................................................................................................................148

    IV.1.10. Comment rediriger les sorties standard et derreur vers des fichiers spars? ......149

    IV.1.11. Comment crire un script qui ait 3 sorties standard? .............................................149

    IV.1.12. Comment drouter lexcution dun programme sur rception dun signal? ........151

    IV.1.13. Comment effectuer une slection parmi plusieurs solutions (CASE)? .................152

    IV.1.14. Comment ter le suffixe un nom de fichier? ......................................................154

    IV.1.15. Comment associer plusieurs conditions dans un test (IF)? ....................................154IV.1.16. Comment se dbarrasser de messages derreurs qui ne mintressent pas? ..........155

  • 8/8/2019 Guide Korn Shell - FR

    10/240

    page 10 - Guide du KornShell sous UNIX

    Table des matires

    jfpujol,

    18aot1993

    IV.2. Cas types avec la ligne de commande ...................................................... 156IV.2.1. Comment bnficier des facilits de lhistorique des commandes? ........................156

    IV.2.2. Comment retrouver une commande contenant un mot particulier? .........................156IV.2.3. Comment tendre le nom dun fichier que lon est en train de taper? .....................158

    IV.2.4. Comment lancer une commande sans avoir attendre sa fin? ................................159

    IV.2.5. Comment lancer une commande qui ne soit pas tue si on se dconnecte? ............161

    IV.2.6. Comment se replacer dans le rpertoire que lon vient de quitter? ..........................162

    IV.2.7. Comment lister les variables positionnes? celles exportes? .................................162

    IV.2.8. Comment mettre le rpertoire courant dans le prompt? ...........................................162

    IV.2.9. Comment crire un alias? .........................................................................................162

    IV.2.10. Dans quel fichier faut-il dclarer les variables et les alias pour les avoir positionnes chaque session? ....................................................................................................................163

    IV.2.11. Comment lancer une commande avec le contenu du buffer de la souris? .............163

    IV.2.12. O trouver la liste des caractres ascii? .................................................................164

    IV.2.13. Comment lister les fichiers par ordre de taille? .....................................................164

    IV.2.14. Que faire lorsque le shell refuse dafficher le prompt et dexcuter mes commandesaprs chaque retour chariot? .................................................................................................164

    IV.2.15. Pourquoi la sortie dcran continue t-elle de dfiler alors que je viens de taper plusieursfois C? ...................................................................................................................165

    IV.3. Cas types avec les commandes UNIX ..................................................... 166IV.3.1. Comment trier un fichier sur le 3me champ? .........................................................166

    IV.3.2. Comment trier un fichier sur plusieurs champs? .....................................................166

    IV.3.3. Comment rechercher un fichier dans mon arborescence? .......................................166

    IV.3.4. Comment excuter une commande sur une liste de fichiers? ..................................167

    IV.3.5. Comment excuter une commande sur tous les fichiers de mon arborescence? .....168

    IV.3.6. Dans un fichier, comment supprimer les lignes dont les 2 derniers champs sont identi-ques? .....................................................................................................................................168

    IV.3.7. Dans un fichier tri, comment conserver une seule ligne parmi celles dont le 2mechamp est identique? ............................................................................................................169

    IV.3.8. Comment convertir un nombre dcimal en hexa? ..................................................170

    IV.3.9. Comment lancer une commande une date donne? ..............................................171IV.3.10. Comment retrouver les fichiers qui nont pas t modifis depuis plus de trois jours?depuis moins de 3 jours? ......................................................................................................171

    IV.3.11. Comment extraire les 4me et 5me champs des lignes de mon fichier? ..............172

    IV.3.12. Comment garder toutes les lignes de mon fichier qui ne contiennent pas une chaneparticulire? ..........................................................................................................................172

    IV.3.13. Comment recopier un rpertoire entier? ................................................................172

    IV.3.14. Comment retrouver les fichiers qui font un lien sur un fichier donn? .................174

    IV.3.15. Pourquoi je narrive pas supprimer mon fichier? en crer un? ........................175

    IV.3.16. Comment positionner par dfaut les droits dun fichier ? ......................................176

    IV.3.17. Comment dterminer le type ou le contenu dun fichier? ......................................177

    IV.3.18. Comment avoir la rponse une question qui napparait pas ci-dessus? ..............178

  • 8/8/2019 Guide Korn Shell - FR

    11/240

    Table des matires

    Guide du KornShell sous UNIX - page 11

    jfpujo

    l,

    18a

    ot1993

    V. Optimiser un programme shell .........................................................179

    V.1. Cot dexcution ........................................................................................180

    V.2. Quelques conseils en vrac ..........................................................................182

    V.3. Exemples pour viter les boucles ..............................................................183V.3.1. Recherches de chanes ..............................................................................................183

    V.3.2. Manipulation dune partie de ligne ...........................................................................184

    VI. Ecrire un programme shell propre ...................................................187

    VI.1. Pourquoi perdre du temps? ....................................................................... 188

    VI.2. Choix du shell utiliser ............................................................................189

    VI.3. O mettre le nouveau programme ............................................................190

    VI.4. Commentaires, version ............................................................................. 191

    VI.5. Test des options, vrification des arguments ............................................ 192

    VI.5.1. Test de la prsence des options et paramtres .........................................................193VI.5.2. Test de la validit des paramtres ............................................................................195

    VI.6. Entre standard et/ou fichiers nomms .................................................... 197

    VI.7. Manipulation des fichiers temporaires ..................................................... 199

    VI.8. Traitements des signaux ...........................................................................200

    VI.9. Emission des messages derreur ...............................................................202

    VI.10. Gnration du code de retour ................................................................. 203

    VII. Quelques messages derreur courants ............................................205

    VII.1. Format du message .................................................................................. 206

    VII.2. Liste des principaux messages derreur ..................................................208

    VIII. Spcificits SUN-OS 5.1 ..............................................................213

  • 8/8/2019 Guide Korn Shell - FR

    12/240

    page 12 - Guide du KornShell sous UNIX

    Table des matires

    jfpujol,

    18aot1993

    IX. Spcificits AIX 3.2 .........................................................................223

    INDEX .................................................................................................................. 231

    Bibliographie ......................................................................................................... 237

  • 8/8/2019 Guide Korn Shell - FR

    13/240

    Description

    Guide du KornShell sous UNIX - page 13

    I.

    jfpujo

    l,

    18a

    ot1993

    I. Description

  • 8/8/2019 Guide Korn Shell - FR

    14/240

    page 14 - Guide du KornShell sous UNIX

    Description : Introduction : quest ce que le shell?

    I.1.1.

    jfpujol,18aot1993

    I.1. Introduction : quest ce que le shell?

    I.1.1. Description

    Le shell est un interprteur de commandes. Il permet de lancer les commandes UNIXdisponibles sur votre station, en leur affectant un certain nombre de paramtres dexcution, decontrler les donnes dentre et de sortie, les messages derreur ventuels, et surtout de lesenchaner de manire efficace et pratique.

    Un shell est dmarr pour chaque console ouverte (ou fentre X11 quivalente cre) ; il estintractif dans ce cas, car les lignes de commande tapes au clavier sont excutes une par une avecconfirmation systmatique (touche ).

    Un shell est galement cr chaque fois que la commande excuter se trouve tre un fichierascii : le shell lit successivement toutes les lignes du fichier, supposant que ce sont des commandes ;il disparat (rend la main) une fois la fin de fichier atteinte.

    I.1.2. Algorithme simplifi

    Si le shell est intractif, on peut reprsenter son fonctionnement sous la forme de lalgorithmesimplifi suivant :

    Si le shell nest pas intractif, alors on peut considrer quil est lanc directement travers lafonction traiter_ligne() dont le paramtre est le nom du fichier traiter ;

    TANT QUE < dure de la connexion>

    lire_ligne_au_clavier(ligne)

    traiter_ligne(ligne)

    afficher_resultats()

    afficher_prompt()

    FIN TANT QUE

  • 8/8/2019 Guide Korn Shell - FR

    15/240

    Guide du KornShell sous UNIX - page 15

    Description : Introduction : quest ce que le shell?

    I.1.3.

    jfpujo

    l,

    18a

    ot1993

    Voici lalgorithme de la fonction traiter_ligne() :

    I.1.3. Les diffrents shells disponibles

    Le shell est lui mme un fichier binaire, quil est possible de lancer comme nimporte quelleautre commande UNIX. Ainsi, lorsquon parle du shell, cela recouvre en fait un ensemble de troisinterprteurs diffrents, possdant chacun un excutable spcifique :

    i. Le BourneShell, (commande sh), est loriginal, le plus ancien ayant exist sous UNIX ; cestcelui qui possde aussi le moins de fonctionnalits, et qui est le moins pratique utiliser ; parcontre, on est sr de le trouver quelque soit le type de machine.

    ii. Le Csh (commande csh), est plus rcent et intgre des fonctions supplmentaires comme lhis-torique des commandes, indispensable en usage courant ; on le trouve en standard sur la plupartdes machines ; par contre sa syntaxe nest pas compatible avec le Bourne Shell ;

    iii.Le Ksh (commande ksh), est le dernier n et le plus complet ; il accepte toutes les commandesdu Bourne Shell, possde un historique de commandes perfectionn, et la plupart des fonctionna-lits du Csh.

    Cest ce dernier qui servira de base pour les exemples qui suivent, bien que beaucoup deremarques soient valables quelque soit le shell utilis.

    traiter_ligne(ligne)

    POUR DANS

    * :

    TANT QUE NON VIDE

    traiter_ligne()

    FIN TANT QUE

    * :

    charger_et_lancer()* :

    executer_commande()

    * AUTRE :

    afficher_message(command not found)

    FIN POUR

  • 8/8/2019 Guide Korn Shell - FR

    16/240

    page 16 - Guide du KornShell sous UNIX

    Description : Quest ce quun processus UNIX ?

    I.1.3.

    jfpujol,18aot1993

    I.2. Quest ce quun processus UNIX ?

    Un processus UNIX est un fichier binaire en train de sexcuter avec un certainenvironnement :

    - des pointeurs sur les fichiers ouverts ;

    - des ractions programmes aux signaux :

    - division par zro

    - perte de connexion avec la console

    - rception du signal INTERRUPT (touche CTRL C)

    ...

    - etc...

    Pour dmarrer un nouveau processus, cest dire chaque fois que lon veut lancer une nouvellecommande (grep, sort, compile, ..), une technique standard est applique ;

    Le processus en cours fait appel une fonction spciale qui lui permet de se recopier lui-mmeintgralement. Tout est recopi exactement en double, la zone mmoire, la zone de code, lespointeurs sur les fichiers, etc... Seul, le code de retour de la fonction permet de diffrencier lori-ginal (le pre) de la copie (le fils) ;

    lenvironnement du processus fils est modifi en partie si ncessaire (descripteurs de fichier, va-riables exportes, signaux,...), puis la zone de code du fils est crase avec le code du nouveauprogramme excuter, qui dmarre ;

    le pre attend la fin du fils, puis continue de sexcuter.

    Cette mthode peut paratre complexe, mais cest exactement ce qui se passe chaque fois que leshell lance une commande (par la fonction charger_et_lancer() de notre pseudo-interprteur vu plushaut).

    On y dcouvre loccasion la raison pour laquelle le vocabulaire li aux processus est souventtir de tout ce qui touche la descendance ; cest une constante : tout processus a t lanc par unprocessus pre (sauf le premier !) et il hrite de la plupart des ses caractristiques.

    Si votre shell possde un paramtrage dont vous ne savez attribuer la provenance en tudiantvos fichiers de configuration, il y a de grandes chances que ce soit un processus anctre qui laipositionn.

    Mais la cration dun nouveau processus est une action coteuse en ressources systme, et nousverrons plus loin quelles sont les rgles appliquer pour viter dy faire trop souvent appel lors delexcution de programmes.

  • 8/8/2019 Guide Korn Shell - FR

    17/240

    Guide du KornShell sous UNIX - page 17

    Description : Format dune commande UNIX lmentaire

    I.3.1.

    jfpujo

    l,

    18a

    ot1993

    I.3. Format dune commande UNIX lmentaire

    I.3.1. Description

    Si lon oublie pour linstant les caractres de contrle du shell comme ; | ou &, et lasyntaxe de certaines commandes internes au shell (affectation, tests, boucles for,...), une ligne decommande lmentaire a la forme suivante :

    ...

    les champs tant des suites de caractres termins par des , ou des .Alors :

    - le 0 est suppos tre le nom dun fichier binaire ou ascii, ou le nom dunecommande interne au shell ;

    - les 0 N sont des paramtres qui seront passs au dmarrage lexcutable (comme un appel de fonction).

    Le shell va essayer de transformer chaque ligne de commande de manire retomber sur ceschma :

    - le premier champ de la ligne prend le rle de lexcutable lancer ;

    - tous les arguments (de 0 N) sont empils lors de lappel.

    Au programme appel de soccuper correctement de ses paramtres, en faisant le tri, et en lesutilisant de manire souhaite.

    I.3.2. Exemples

    exemple 1 : grep -i -v TOTO /tmp/essai

    Cette commande est destine rechercher dans le fichier /tmp/essai toutes les lignes qui necomprennent pas (option -v) la chane de caractres toto apparaissant indiffremment enmajuscules ou minuscules (option -i).

    Cette commande se dcompose en :

    = grep : la commande

    = -i : le premier argument

    = -v : le second

    = TOTO : le troisime

    = /tmp/essai : le quatrime

    Au moment de lappel de grep, aucune diffrence nest faite entre les quatre arguments ; leshell lance lexcutable grep en lui fournissant les quatre arguments, sans se proccuper de leurordre, ni de leur valeur ou signification.

  • 8/8/2019 Guide Korn Shell - FR

    18/240

    page 18 - Guide du KornShell sous UNIX

    Description : Format dune commande UNIX lmentaire

    I.3.2.

    jfpujol,18aot1993

    Par contre, lorsque la commande grep commence travailler, sa premire action est defaire le tri et de tester les paramtres qui lui t fournis. Cest ce moment que le type desarguments a une signification : certains doivent commencer par un tiret (ce sont des options de

    la commande) et dautres non (ce sont des paramtres de la commande).

    En rsum, le shell spare et fournit la commande les diffrents champs constituant la ligne ;la commande rcupre les champs et vrifie quils correspondent bien sa syntaxe.

    exemple 2 : sed s/^#// /tmp/toto

    Cette commande renvoie le fichier /tmp/toto sans caractre # en dbut de ligne.

    Elle se dcompose en :

    = sed : la commande

    = s/^#// : le premier argument

    = /tmp/toto : le second

    On voit ainsi que la commande sed utilise le premier argument comme la commande excuter sur le fichier dont le nom est indiqu par le second argument.

  • 8/8/2019 Guide Korn Shell - FR

    19/240

    Guide du KornShell sous UNIX - page 19

    Description : Les entres-sorties dune commande UNIX lmentaire

    I.3.2.

    jfpujo

    l,

    18a

    ot1993

    I.4. Les entres-sorties dune commande UNIXlmentaire

    Pour faire dialoguer une commande (un processus) avec lextrieur, et le shell en particulier, ondispose de diffrentes solutions ;

    en ENTREE : Les paramtres de position1:

    de 0 N, comme on a vu au paragraphe prcdent. (le nom dela commande est pass aussi en tant quargument 0).

    Si la ligne de commande est :

    cmd arg1 arg2

    lappel de cmd pourrait tre assimil lappel dune fonction

    cmd() avec les 3 arguments cmd, arg1, arg2 passs parvaleur ;

    Les variables exportes :

    Toutes les variables faisant partie de lenvironnement exportsont visibles et utilisables par la commande ; par contre, lamodification du contenu dune de ces variables exportesnaura quune porte locale (pas de possibilit de retourner unevaleur de cette manire).

    On place une variable dans lenvironnement export par lacommande shell :

    export NOM_DE_LA_VARIABLE

    en SORTIE : le code de retour :

    La variable shell $? contient le code de retour de la dernirecommande lance par le shell. Si la commande sest terminenormalement, le code de retour vaut gnralement 0 ; (lemanuel de rfrence indique le code de retour de chaquecommande).

    Si la commande est elle-mme un programme shell qui sesttermin sur une instruction exit , le code de retour

    vaut , sinon il vaut le code de retour de la dernirecommande excute dans le programme.

    en ENTREE / SORTIE : les fichiers.

    Par dfaut, il y en a trois douverts par le shell avant lelancement de chaque commande :

    - 1 en entre : lentre standard

    - 2 en sortie : la sortie standard et la sortie derreur.

    1. on appelle ici argumentun champ plac aprs le nom de la commande sur la ligne de commande, etparamtre

    de position, cet argument, mais vu par la commande pendant son excution.

  • 8/8/2019 Guide Korn Shell - FR

    20/240

    page 20 - Guide du KornShell sous UNIX

    Description : Les entres-sorties dune commande UNIX lmentaire

    I.3.2.

    jfpujol,18aot1993

    Il est rappele que le shell qui lance une commande positionne le ncessaire pour que cesentres-sorties soient disponibles : mais, une fois lance, il est du ressort de la commande de lesutiliser et de retourner des valeurs couramment attendues1.

    En gnral, une commande UNIX lit les donnes sur lentre standard, les modifie en fonctiondes arguments spcifis, (options ou paramtrage) et renvoie le rsultat sur la sortie standard. Si uneerreur intervient, elle affiche un message sur la sortie derreur, et renvoie un code de retour diffrentde zro.

    Une bonne habitude consiste respecter cette convention, ce qui permet ainsi dcrire etdintgrer facilement de nouvelles commandes au milieu de celles dj existantes.

    1. voir le chapitre consacr ce sujet plus loin : crire un shell propre page 187

  • 8/8/2019 Guide Korn Shell - FR

    21/240

  • 8/8/2019 Guide Korn Shell - FR

    22/240

    page 22 - Guide du KornShell sous UNIX

    Description : La manipulation des fichiers

    I.5.2.

    jfpujol,18aot1993

    Comme aucune directive ne touche le descripteur 1, on ne le modifie pas. Lanctre du shellactuel, le shell de login par exemple, lavait dj affect la console : il y est encore par hritage.

    Le nouveau processus grep lit les lignes prsentes sur son entre standard (descripteur 0), etrecopie celles contenant la chane truc sur la sortie standard (descripteur 1).

    Rsultat : les lignes du fichier toto qui contiennent la chane truc saffichent lcran, et le fichier trace est vide.

    On peut suivre les connexions des diffrentes sorties de la commande sur le schma suivant :

    flches grises : ltat des connexions de la commande grep sans les redirections ;

    flches noires : avec les redirections.

    1

    0

    2

    0

    2

    0

    1

    2

    toto

    trace

    grep (truc)

    ksh (ligne de commande)

    ksh (login)

    1

  • 8/8/2019 Guide Korn Shell - FR

    23/240

  • 8/8/2019 Guide Korn Shell - FR

    24/240

    page 24 - Guide du KornShell sous UNIX

    Description : La manipulation des fichiers

    I.5.3.

    jfpujol,18aot1993

    processus ou un fichier donn, mais un utilisateur peut avoir de manire simultane plusieursprocessus ou fichiers ayant des groupes diffrents.

    Cest ladministrateur du systme qui dfinit les groupes dans lesquels vous pouvez vouspositionner, ou positionner vos fichiers. Un processus ou un fichier est li dans tous les cas undoubl (uid,gid) :

    - uid tant lidentificateur de lutilisateur ayant cr le processus ou le fichier ;

    - gid tant le groupe courant au moment de la cration du processus ou du fichier.

    Les trois ensembles ci-dessus dfinissent trois classes dappartenance :

    - user : la classe de tous les fichiers ou processus ayant le mme propritaire quelutilisateur (ici, uid1)

    - group : la classe des fichiers ou processus ayant le mme groupe que lutilisateur(ici, gid1).

    - others : celle des fichiers ou processus nayant ni le mme propritaire, ni lemme groupe que lutilisateur (uid1).

    On remarquera quil nest possible dappartenir qu une seule classe la fois, et que la prioritva la classe user. Ainsi, le propritaire dun fichier appartient doffice la classe user, et parconsquent ne peut jamais appartenir ni la classe group, ni la classe others.

    On peut dfinir sous UNIX des droits dun fichier en lecture (r), en criture (w), et en excution(x) pour chacune de ces classes. Seul le propritaire dun fichier (ou ladministrateur1) peut modifierles droits de celui-ci .

    1. Voir le paramtrage possible avec la commandeumask: page 176

    fichier(uid1,gid1)

    process(uid2,gid1)

    fichier(uid3,gid1)

    fichier(uid4,gid5)

    process(uid1,gid2)

    user (uid1)

    group(gid1)

    others

  • 8/8/2019 Guide Korn Shell - FR

    25/240

    Guide du KornShell sous UNIX - page 25

    Description : La manipulation des fichiers

    I.5.3.

    jfpujo

    l,

    18a

    ot1993

    Symbologie :

    Dans lexemple du fichier essai1 qui est indiqu ici :

    - la classe user est en criture, en lecture et en excution : cest dire que lepropritaire peut lire, crire et faire excuter le fichier.

    - la classe group a les droits en lecture et en excution : cest dire que les utilisateursou les processus autres que le propritaire et dont le groupe est identique celui dufichier pourront lire et excuter le fichier.

    - la classe others a les droits en lecture et en excution : les utilisateurs autres que lepropritaire du fichier et dont le groupe est diffrent de celui du fichier pourront le lire

    et lexcuter.

    On a indiqu plus haut quun utilisateur ou un processus ne pouvait appartenir qu une seuleclasse, cela signifie quil nest concern que par les droits de la classe qui lui correspond, les autres(pour les deux autres classes) tant non significatifs.

    Pour connatre les droits que lon possde sur un fichier, il suffit de comparer ses propres uidetgid(que lon peut avoir en tapant la commande id) avec ceux du fichier :

    - si mon uid est celui du fichier : je suis le propritaire et les droits qui me concernentsont ceux de la classe user.

    droits pour la classe others

    droits pour la classe group

    droits pour la classe user

    rwx

    droit en excution valide pour la classe considre

    droit en criture valide ...

    droit en lecture valide ...

    si un tiret - remplace une des lettres, cest que le droit

    correspondant est supprim.

    (uid)

    $ ls -l essai1-rwxr-xr-x 1 logis users 80 Apr 21 10:05 essai1(gid)

    $ iduid=207(logis) gid=20(users)$

  • 8/8/2019 Guide Korn Shell - FR

    26/240

    page 26 - Guide du KornShell sous UNIX

    Description : La manipulation des fichiers

    I.5.3.

    jfpujol,18aot1993

    - si mon uid nest pas celui du fichier, mais mon gid est celui du fichier, mes droitssont ceux de la classe group.

    - si mon uid nest pas celui du fichier, pas plus que mon gid, alors mes droits sontceux de la classe others.

    Droits sur les rpertoires.

    Pour linstant, il na pas t indiqu comment on pouvait autoriser la cration ou la suppressiondun fichier.

    Lorsquon cre un fichier dans un rpertoire, ou quon le dtruit, cela revient modifier lecontenu du rpertoire correspondant : on rajoute ou on enlve un lment dans la liste. Pourmodifier le rpertoire, il faut avoir les droits en criture dessus.

    Le fonctionnement des droits en lecture et en criture sur un rpertoire se fait de la mmemanire que pour les fichiers, en gardant lesprit que :

    - la lecture dun rpertoire se fait lorsquon liste son contenu (par la commande ls parexemple, ou si on utilise des caractres spciaux symbolisant les noms de fichiers : *? [ ] ...)

    Mme sil nest pas possible de lister le contenu dun rpertoire, on peut nanmoinsatteindre et lister les fichiers des sous-rpertoires, sil en existe, et si on connat leurnom.

    - lcriture dans un rpertoire se fait lorsquon cre ou dtruit un fichier

    - lexcution se fait lorsquun chemin de fichier ou une commande cd spcifie le nom dece rpertoire.

    De manire image, on pourrait penser que lon passe par un rpertoire lorsquonessaie datteindre un fichier que ce rpertoire contient, ou quun sous-rpertoirecontient ; si lexcution est interdite, on ne peut plus passer.

    En conclusion, si les droits en excution sont enlevs sur un rpertoire, il ne sera pluspossible pour les utilisateurs de la classe correspondante dutiliser des chemins quicontiennent ce rpertoire.

    En rsum :

    Pour crer ou supprimer un fichier, il faut avoir les droits suffisant sur le rpertoire qui lecontient ;

    Pour crire, lire ou excuter un fichier, il faut avoir des droits suffisants sur le fichier lui-mme.

    Remarque :

    Lorsque vous crez un fichier de commande, pensez rajouter les droits dexcutiondessus sans quoi vous ne pourrez pas le lancer ; vous obtiendrez le message : cannotexecute.

  • 8/8/2019 Guide Korn Shell - FR

    27/240

    Guide du KornShell sous UNIX - page 27

    Description : La manipulation des fichiers

    I.5.4.

    jfpujo

    l,

    18a

    ot1993

    I.5.4. Les liens

    Il arrive parfois davoir besoin, dans plusieurs rpertoires, ou sous diffrents noms, de plusieursexemplaires dun fichier de rfrence.

    Une premire solution consiste recopier physiquement le fichier aux diffrents endroits ousous les diffrents noms.

    Mais cela a deux inconvnients majeurs :

    - dune part, si ce fichier est commun plusieurs utilisateurs ou applications, il estindispensable, chaque fois quune modification simpose, de retoucher successivementles N copies dj faites ;

    - dautre part, la place occupe au total est proportionnelle au nombre dexemplairesncessaires.

    La solution consiste faire des liens plutt que des copies : il existe alors un seul exemplairephysique du corps du fichier (contenant les donnes), et plusieurs rfrences pointant toutes vers cetunique corps.

    La cration dun lien se fait avec une syntaxe identique une copie classique :

    pour une copie :

    cp ancien nouveau

    pour un lien :

    ln ancien nouveau

    ou bien ln -s ancien nouveau

    Il y a deux faons de crer un lien, car il existe en fait deux types de liens :

    - les liens physiques

    - les liens symboliques

    1.5.4.1. Les liens physiques

    Pour comprendre ce quest un lien physique, il faut savoir quun fichier UNIX est compos dedeux parties principales :

    le corps, qui contient les donnes proprement dites;

  • 8/8/2019 Guide Korn Shell - FR

    28/240

    page 28 - Guide du KornShell sous UNIX

    Description : La manipulation des fichiers

    I.5.4.

    jfpujol,18aot1993

    linode, qui contient les informations sur le fichier lui-mme : droits, propritaire, type, datede modification, etc... Voil ce quon peut imaginer trouver dans le rpertoire jef aprsavoir lanc la commande cp fic1 fic2, partir dun fichier fic1 dj existant.

    Crer un lien physique, cest crer une deuxime rfrence, dans le mme rpertoire, ou dans unautre, pointant sur une inode d un fichier dj existant.

    Voil le rsultat de la commande ln fic1 fic2, partir du fichier fic1 dj existant :

    Dans le cas ci-dessus, les deux rfrences jouent exactement le mme rle, la premire nayantaucune caractristique supplmentaire par rapport la seconde (cest encore vrai sil y N liens surun fichier, au lieu de deux comme ici).

    cration du lien

    On vient de voir que la commande qui permet de crer un lien physique, appel nouveau, etpointant sur le fichier ancien dj existant est :

    ln ancien nouveau

    jef/

    bin/FIC1 FIC2rfrence

    corps

    inode 12657 8754

    jef/

    bin/FIC1 FIC2rfrence

    corps

    12657inode

  • 8/8/2019 Guide Korn Shell - FR

    29/240

    Guide du KornShell sous UNIX - page 29

    Description : La manipulation des fichiers

    I.5.4.

    jfpujo

    l,

    18a

    ot1993

    Exemple :

    Vous remarquerez que les deux fichiers, une fois le lien fait, ont tout en commun, sauf larfrence (le nom) : toute modification apporte un des deux fichiers est reporte sur lautre. Ilnest pas possible par exemple, que ces deux fichiers lis aient des propritaires diffrents, ou desdroits diffrents.

    La commande ls -l indique le nombre de liens physiques qui pointent sur le corps dun fichierdonn (voir lexemple ci-dessus). Avant la commande de cration du lien, le fichier ancienpossdait un lien sur son corps. Aprs, on voit quil existe deux liens sur le corps duquel pointent lesdeux fichiers ancien et nouveau.

    Remarque: il est possible de lier des fichiers depuis des rpertoires diffrents. Il existecependant des restrictions qui sont indiques un peu plus loin.

    suppression du lien

    Chaque rfrence ayant un rle quivalent, on peut supprimer nimporte laquelle (nimportelequel des fichiers lis) sans toucher aux autres. Ce nest que lorsquon supprime la dernirerfrence que le corps du fichier est supprim aussi.

    La suppression dun lien physique se fait comme pour un fichier normal, avec la commande rm.

    $ date >ancien

    $ ls -l *-rw-r--r-- 1 logis users 32 Jul 3 15:26 ancien$ ln ancien nouveau$ ls -l *-rw-r--r-- 2 logis users 32 Jul 3 15:26 ancien-rw-r--r-- 2 logis users 32 Jul 3 15:26 nouveau$ echo >nouveau$ ls -l *-rw-r--r-- 2 logis users 1 Jul 3 15:27 ancien-rw-r--r-- 2 logis users 1 Jul 3 15:27 nouveau

    nombre de liens sur le fichier

    $ ls -l *-rw-r--r-- 2 logis users 1 Jul 3 15:27 ancien-rw-r--r-- 2 logis users 1 Jul 3 15:27 nouveau$ rm ancien$ ls -l *-rw-r--r-- 1 logis users 1 Jul 3 15:27 nouveau

    $

  • 8/8/2019 Guide Korn Shell - FR

    30/240

    page 30 - Guide du KornShell sous UNIX

    Description : La manipulation des fichiers

    I.5.4.

    jfpujol,18aot1993

    petit exercice distrayant

    Dterminer partir du rsultat de la commande ls -l1 donn ci-dessous le nombre de sous-

    rpertoires prsents dans le rpertoire manuel_shell :

    correction (pour les feignants)

    Les rpertoires constituent un arbre ; ils sont chans les uns aux autres par lintermdiaire desdeux sous-rpertoires : . et .., que lon retrouve dans tout rpertoire, mme vide. Ces deuxrpertoires gnriques sont en fait des liens : .. est un lien sur le rpertoire de niveau suprieur (cd.. permet de remonter dun cran vers la racine / ), et . un lien sur le rpertoire courant.

    A la cration dun rpertoire (par mkdir par exemple), celui-ci est li deux fois. Or chaque foisque lon rajoute un sous-rpertoire, on rajoute par la mme occasion un lien .. sur le rpertoirecourant. Donc, on a la relation suivante :

    nombre de sous-rpertoires = nombre de liens sur le rpertoire courant - 2

    Ici, on voit que le nombre de liens est 4 ; donc le nombre de sous-rpertoires doit tre 2. :

    gagn !

    Attention :

    Il nest pas possible de faire des liens physiques sur des rpertoires... cest une

    manipulation qui est rserve au systme pour grer les arborescences, mais qui nestpas accessible aux utilisateurs.

    1. la commande ls -l rpertoire donne des informations sur le contenu de rpertoire, alors que la

    commande ls -ld rpertoire donne les informations sur le rpertoire (ou dfaut le fichier) lui-mme.

    $ ls -ld manuel_shelldrwxr-xr-x 4 logis users 1024 Apr 24 12:15 manuel_shell$

    $ ls -l manuel_shelltotal 6drwxr-xr-x 3 logis users 2048 Jul 3 13:54 exemplesdrwxr-xr-x 2 logis users 1024 Apr 24 12:48 perf$

  • 8/8/2019 Guide Korn Shell - FR

    31/240

    Guide du KornShell sous UNIX - page 31

    Description : La manipulation des fichiers

    I.5.4.

    jfpujo

    l,

    18a

    ot1993

    Inconvnients dun lien physique

    La rfrence,linode et le corps dun fichier sont des entits qui sont toujours runies ensemble

    sur la mme unit de disque, voire la mme partition de disque. Or, la totalit de larborescencelogique que vous pouvez accder est le plus souvent dcoupe en plusieurs sous-arborescences,lies chacune une unit de disque, ou une partition. Il nest donc pas possible de lier des fichiersen les localisant dans deux rpertoires appartenant des disques ou partitions diffrents.

    On a essay de lier le fichier ancien qui se trouve sur le disque utilisateur,

    avec un que lon voudrait placer dans /tmp qui se trouve (ici) sur le disquesystme : impossible.

    Il nest pas possible de faire un lien physique sur un rpertoire.

    Avantage

    Si vous dplacez par la commande mv un des fichiers lis, (dans la limite du disque ou de la par-tition) tous les liens restent intacts.

    1.5.4.2. Les liens symboliques

    Plutt que de dupliquer la rfrence, la cration du lien symbolique va consister crer un toutpetit fichier dun type spcial, et dont le contenu (la partie donnes) correspond la localisation(absolue ou relative) du fichier auquel il est li.

    cration du lien

    La commande de cration du lien symbolique nouveau pointant sur le fichier ancien est :

    ln -s ancien nouveau

    $ ln ancien /tmp/nouveauln: different file system$

    voir

    $ ls -ltotal 2-rw-r--r-- 1 logis users 1 Jul 3 15:27 ancien$ ln -s ancien nouveau$ ls -ltotal 4-rw-r--r-- 1 logis users 1 Jul 3 15:27 ancienlrwxr-xr-x 1 logis users 6 Jul 3 17:35 nouveau -> ancien$

  • 8/8/2019 Guide Korn Shell - FR

    32/240

    page 32 - Guide du KornShell sous UNIX

    Description : La manipulation des fichiers

    I.5.4.

    jfpujol,18aot1993

    Ici, on reconnat le lien symbolique au caractre l qui prcde les droits, et au nom du fichiersur lequel il pointe qui indiqu en fin de ligne.

    Tant quon nessaie pas de lire son contenu, un lien symbolique se comporte peu prs commeun fichier standard : on peut par exemple modifier son propritaire. Par contre, ds quon tente dylire ou crire, ou de changer ses droits daccs, on accde en fait au donnes, ou linode du fichierdont il a enregistr le nom (ou le chemin, sil pointe sur un fichier dun autre rpertoire).

    Un accs au contenu dun lien symbolique ncessite pour le systme deux accs successifs :

    - le premier, pour lire sur quel fichier pointe le lien ;

    - le second, pour accder au fichier point, et lire ses donnes.

    Remarquez donc que pour lire le contenu de nouveau, il faut avoir les droits en lecture dessus(pour pouvoir lire le chemin vers lequel il pointe), puis ensuite les droits sur le fichier point (cest dire ancien, pour pouvoir lire les donnes quil contient).

    suppression du lien

    Le fichier initial (qui contient rellement les donnes) nest absolument pas touch de quelque

    manire que ce soit lorsquon dclare un lien symbolique pointant sur lui.

    Ce qui veut dire que si le fichier initial est dtruit ou dplac, alors quil existait un liensymbolique pointant sur lui, le lien pointe maintenant sur RIEN !

    Par contre, si on lance la commande rm sur le lien symbolique, seul le lien est perdu ; le fichiersur lequel il pointait nest pas concern.

    voir

    voir

    jef/

    bin/

    ancien nouveau

    ancienlecture ou criture

  • 8/8/2019 Guide Korn Shell - FR

    33/240

    Guide du KornShell sous UNIX - page 33

    Description : La manipulation des fichiers

    I.5.4.

    jfpujo

    l,

    18a

    ot1993

    Une tentative de lecture dun lien symbolique pointant sur un fichier inexistant provoque lemessage : No such file or directory

    Inconvnients

    Un lien symbolique augmente le temps daccs au donnes : le systme de fichiers doit faire unepremire lecture dans le lien pour connatre le chemin du fichier contenant les donnes ; puis undeuxime accs vers le fichier de donnes lui-mme.

    Si le fichier sur lequel pointe le lien symbolique est dplac ou supprim, le lien continue depointer vers un fichier inexistant : il faut le dtruire et le reconstruire.

    Avantages

    Le problme de disque physique ou de partition napparait pas ici ; on peut faire un lien symbo-lique sur tout fichier de larborescence.

    Il est possible de faire des liens symboliques sur des rpertoires

    la commande ls -l permet de savoir clairement vers quel fichier pointe le lien.

    Si le fichier ancien est supprim puis recr ensuite sous le mme nom au mme endroit, (parune procdure automatique, ou lors dune monte de niveau logicielle par exemple), le lien esttoujours valide.

    Pour les deux types de liens, vous trouverez dans le chapitre sur les cas types des exemples decommandes permettant de lister tous les liens qui pointent vers un fichier donn : voir page 174

    jef/

    ancien nouveau

    ancien

    lecture ou criture

    jef/

    nouveau

    ancien

    lecture ou critureRIEN

    rm ancien

  • 8/8/2019 Guide Korn Shell - FR

    34/240

    page 34 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.1.

    jfpujol,18aot1993

    I.6. Interprtation dune commande shell

    Une ligne shell comprend gnralement un certain nombre de symboles et de caractresspciaux. Linterprteur va les valuer, puis les remplacer par les chanes de caractrescorrespondantes, en fonction de certaines rgles que nous allons dtailler.

    Pour bien valuer ce que votre ligne va devenir une fois interprte, il est bon dimaginer ladmarche du shell lorsquil manipule votre ligne.

    On peut considrer que la transformation se fait par passes, en seffectuant dans lordre quisuit :

    1 Interprter les sparateurs et sparer les champs

    2 Isoler les chanes de caractres encadres par des quotes

    3.1 Remplacer les variables par leur contenu

    3.2 Excuter les commandes encadres par des anti-quotes ou la squence$() et les remplacer par leur rsultat

    4 Isoler les chanes de caractres encadres par des double-quotes

    5 Remplacer les caractres spciaux (*, [], ?, ~ , etc...) par leur valeur

    6 Reprer les squences () ou {}

    7 Positionner certains paramtres en fonction des caractres spciaux ; | &&& ||

    8 Mettre en place les redirections9 Localiser les commandes lmentaires (alias, fonctions, path)

    Ltape 3 est dcompose en deux sous-niveaux quivalents car les rsultats respectifs de cesdeux sous-niveaux ne peuvent pas tre utiliss lun par lautre (en quelque sorte, les deuxtransformations sont faites en parallle).

    Evidemment, il existe des cas particuliers qui namliorent pas vraiment la simplicit delalgorithme donne ci-dessus ; vous pouvez toujours vous reporter au manuel des commandesUNIX (section 1) sur le ksh, section Specials commands, pour les dtailler.

    I.6.1. Etape 1 : Interprtation des sparateurs

    Comme dans le cas dune commande simple, une commande shell est dcoupe en paquets quiseront valus un un. Couramment, les sparateurs de champs (ou paquets) sont les caractres et . En fait, ces sparateurs sont placs dans la variable IFS delenvironnement, et rien nempche de modifier son contenu pour que le shell travaille avec dautressparateurs.

    En fin dvaluation de la ligne, tout ce qui est accol sans sparateur forme un champ ; ainsi

    pour concatner plusieurs chanes, il suffit de les mettre bout bout.

  • 8/8/2019 Guide Korn Shell - FR

    35/240

    Guide du KornShell sous UNIX - page 35

    Description : Interprtation dune commande shell

    I.6.2.

    jfpujo

    l,

    18a

    ot1993

    I.6.2. Etape 2 : Le caractre spcial quote

    Toute chane encadre par des caractres quote est prise telle quelle et nest pas transforme.Aucun des symboles du shell ni des caractres spciaux nest valu.La chane contenue (y comprisles espaces, tabulations, etc..) constituera un champ de la commande qui sera lance. Ceci expliquelexemple suivant :

    Lorsque les noms des deux fichiers sont placs entre quotes, lensemble, y comprislespace entre les deux noms forme un seul champ, qui est donc valu par la commandeUNIX ls ; or, il nexiste pas dans le rpertoire de fichier dont le nom est :

    toto1.ctoto2.c ; la commande choue.

    Attention : Il nest pas possible de placer un caractre quote lintrieur dune chane elle-mme dfinie par des quotes.

    Pour faire perdre au caractre quote sa signification particulire, on peut le protger par lecaractre\, ou bien le placer lui mme lintrieur dune chane encadre par des double-quotes (!!).

    I.6.3. Etape 3 : Les variables et le caractre spcial anti-quote ou $()

    1.6.3.1. Etape 3.1 : Les variables

    Les variables du shell sont composes de lettres de lalphabet, majuscules ou minuscules (plusle caractre soulign : _), et de chiffres, sauf en premire position ; par dfaut, elles ont toutes letype : chane de caractres.

    Si le nom de la variable nest constitu que de chiffres, son contenu est un des paramtres fourniau programme en cours lors de son dmarrage. ($0 est le nom du programme en cours, $1 le premierargument fourni lappel du programme en cours, $3 le troisime et ${10}1 le dixime : voir lesvariables prpositionnes page 38.

    1. $10 nest pas le contenu du 10me paramtre, mais le contenu du premier paramtre suivi dun zro. Voir plus

    loin la signification des { } dans les noms de variable.

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].c

    toto1.c toto2.c

    $ ls

    toto1.c toto2.c toto_base.c tutu

    $ ls toto1.c toto2.c

    toto1.c toto2.c

    toto1.c toto2.c not found$ ls toto1.c toto2.c

  • 8/8/2019 Guide Korn Shell - FR

    36/240

    page 36 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.3.

    jfpujol,18aot1993

    Pour affecter une variable, on la fait suivre, sans sparateur, du signe gal et dun champ (lachane voulue).

    Pour utiliser une variable (la lire), on fait prcder son nom du caractre $

    On voit ci-dessus que le champ avec lequel on affecte la variable peut tre compos grceaux quotes, ou de la mme faon avec des double-quotes, quon dcrit plus loin page 42.

    Pour concatner le contenu de plusieurs variables, il suffit de les accoler entre elles ; de lamme manire, pour concatner le contenu dune variable et une chane fixe, il suffit de lesaccoler.

    Mais dans ce cas, il peut exister des ambiguts sur le nom de la variable (o finit le nom de

    la variable et o commence la chane fixe?), sauf si la chane fixe commence par un caractreautre que ceux autoriss pour les noms de variables.

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ toto=un$ tutu=deux trois$ echo $toto $tutu totoun deux trois toto

    $ ls

    toto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ s1=Korn$ s2=Shell

    $ echo $s1$s2KornShell$ echo Korn$s2KornShell$ echo $s1-$s2Korn-Shell

  • 8/8/2019 Guide Korn Shell - FR

    37/240

    Guide du KornShell sous UNIX - page 37

    Description : Interprtation dune commande shell

    I.6.3.

    jfpujo

    l,

    18a

    ot1993

    Pour lever lambigut, si ncessaire, on encadre alors le nom de la variable par desaccolades { }, toujours prcdes du caractre $.

    Dans lexemple ci-dessus, la commande echo $s1Shell ne donne rien car le shell essaiede fournir le contenu de la variable dont le nom est s1Shell, qui nexiste pas.

    Une commande du shell (la commande set) permet de choisir si une tentative de lecturedune variable inexistante doit provoquer un message derreur ou non ; ici, il ny a pas demessage derreur. Cela peut tre pratique, mais aussi la cause de disfonctionnement apparemmentincomprhensible, si une faute de frappe sest glisse dans votre programme (oubli du caractre $devant un nom de variable !).

    Environnement export

    Pour quune variable soit place dans lenvironnement export1, on utilise la commande

    export :export nom_de_variable

    On peut raliser laffectation en mme temps :

    export nom_de_variable=valeur

    Tableaux

    Il est possible de dfinir des tableaux une dimension de la manire suivante :

    nom_du_tableau[indice1]=

    nom_du_tableau[indice2]=

    etc..

    ou de cette faon :

    set +A nom_du_tableau ...

    auquel cas le tableau nom_du_tableau est initialis dans lordre avec les paramtresfournis. (voir la commande set au chapitre qui est consacr aux commandes du shell)

    1. cest dire lenvironnement vu automatiquement par tout processus au moment de sa naissance

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ s1=Korn$ echo $s1Shell

    $ echo ${s1}ShellKornShell

  • 8/8/2019 Guide Korn Shell - FR

    38/240

    page 38 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.3.

    jfpujol,18aot1993

    Pour lire un lment du tableau toto, on utilise la syntaxe suivante :

    ${toto[]}

    La dernire commande montre bien que la syntaxe du shell est parfois peu orthodoxe !($toto[1] nest pas considr comme le premier lment du tableau toto, maiscomme le contenu de la variable toto accol avec la chane littrale [1])

    Il nest pas possible dexporter des tableaux entiers : vous narriverez qu exporter lepremier lment du tableau en utilisant la commande export.

    Variables prpositionnes

    Lorsque le shell courant ou un programme en shell dmarre, son environnement contient un

    certain nombre de variables qui sont positionnes dynamiquement, et dont le contenu, pour lesprincipales, est le suivant :

    $0 le nom du programme shell en cours.

    $1, ..${N} les N paramtres passs au programme (au shell) lors de son appel.

    $# le nombre de paramtres passs lappel du programme shell (non comprisle paramtre $0)

    $* la liste des paramtres passs lappel du programme shell (non compris leparamtre $0)

    $$ le numro de processus courant (il y a un numro unique par processus sur

    la machine)$PPID le numro du processus parent du processus courant (de ce shell)

    $RANDOM un nombre alatoire, entre 0 et 32767 (change chaque lecture)

    $IFS la liste des sparateurs de champs dans une ligne du shell (par dfaut et )

    $HOME votre rpertoire principal

    $PWD le rpertoire courant

    $PATH1 la liste des rpertoires o le shell est susceptible de trouver les commandeslmentaires excuter. Cette variable est toujours positionne dans les

    1. voir aussi le paragraphe sur le path page 58

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ toto=ksh$ toto[1]=Korn$ toto[2]=Shell$ i=1$ echo ${toto[$i]}Korn$ echo $toto[1]ksh[1]

  • 8/8/2019 Guide Korn Shell - FR

    39/240

    Guide du KornShell sous UNIX - page 39

    Description : Interprtation dune commande shell

    I.6.3.

    jfpujo

    l,

    18a

    ot1993

    fichiers profile (/etc/profile et .profile) au moment dudmarrage, mais nest pas, en fait, modifie dynamiquement par la suite.

    $SECONDS le contenu initial de la variable SECONDS plus le nombre de secondescoules depuis sa dernire affectation. Si la variable na jamais taffecte, elle napparait pas.

    $LINENO le numro de la ligne dans le programme ou la fonction en cours

    $PS1 votre prompt (ce qui saffiche aprs chaque ligne de commande en modeintractif)

    $? le code derreur de la dernire commande excute.

    Oprateurs sur les variables.

    Il existe de nombreux oprateurs que lon peut appliquer lorsquon lit une variable. Voici les

    plus courant :

    ${#toto} la longueur du contenu de la variable toto

    (Par la suite, on dsignera par

    un pattern,ou expression gnrique1, cest dire unesuite de caractres ventuellement spciaux qui reprsente un ensemble de chanescorrespondantes. Par exemple, toto* est un pattern, qui reprsente toutes les chanes decaractres commenant par toto et suivies par nimporte quoi.)

    ${toto#

    }le contenu de la variable toto sans son dbut si celui-ci correspond aupattern.

    ${toto##

    } la mme chose que prcdemment, mais la plus grande partie possible est

    supprime.${toto%

    }le contenu de la variable toto sans sa fin si celle-ci correspond au pattern

    1. Voir page 70

  • 8/8/2019 Guide Korn Shell - FR

    40/240

    page 40 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.3.

    jfpujol,18aot1993

    ${toto%%

    } la mme chose que prcdemment, mais la plus grande partie possibleest supprime.

    Dans lexemple ci-dessus, on utilise souvent pour former le pattern le caractre * , qui

    est un caractre spcial signifiant : < une chane comprenant nimporte quel nombre denimporte quel caractre1>.

    De plus, il est possible de placer le pattern dans une variable, et de dcomposer lepattern en plusieurs lments::

    1. Voir page 70

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ toto=/users/petrus/logis/truc.def$ echo ${#toto}28$ echo ${toto#*/}users/petrus/logis/truc.def$ echo ${toto##*/}truc.def$ echo ${toto%.def}/users/petrus/logis/truc$ echo ${toto%.*}

    /users/petrus/logis/truc$ echo ${toto%pouet}/users/petrus/logis/truc.def$ echo ${toto%ru*}/users/petrus/logis/t$ echo ${toto%%ru*}/users/pet

    $ toto=/users/petrus/logis/truc.def

    $ pattern=ru*

    $ echo ${toto%%$pattern}

    /users/pet

    $ pattern=ru

    $ expand=*$ echo ${toto%%${pattern}${expand}}

    /users/pet

    $

  • 8/8/2019 Guide Korn Shell - FR

    41/240

    Guide du KornShell sous UNIX - page 41

    Description : Interprtation dune commande shell

    I.6.3.

    jfpujo

    l,

    18a

    ot1993

    et, toujours plus fort, dimbriquer les substitutions:

    1.6.3.2. Etape 3.2 : Le caractre spcial anti-quote ou $( )

    Lorsquune chane est encadre par des anti-quotes ou par la squence $( ), elle est considrecomme une commande, et la squence est remplace par son rsultat (sortie standard de lacommande) une fois excute.

    Cependant, les tapes vues au-dessus ne sont pas rvalues : la chane est excute tellequelle ce niveau dinterprtation, en fonction des tapes 4 et suivantes.

    Si on dcompose linterprtation de la ligne donne en exemple ci-dessus,

    - la chane $PWD est encadre par des quotes, elle est donc protge (tape 2) ;

    - $(ls) est remplac par le rsultat de la commande ls, (tape 3) soit :

    toto1.c toto2.c toto_base.c tutu

    - $(echo $PWD) est remplac (tape 3) par le rsultat de la commande echo sur lachane littrale $PWD (puisque la chane $PWD a t protge) ;

    A la fin de cette tape, la ligne se prsente donc sous la forme suivante :

    echo toto1.c toto2.c toto_base.c tutu $PWD

    Comme ltape de transformation des variables nest faite quune fois, $PWD nest pasvalue ce niveau (nous sommes ltape 4 ou plus), et on obtient le rsultat indiqu.

    $ toto=/users/petrus/logis/truc.def

    $ pattern1=rubis

    $ pattern2=bis

    $ expand=*

    $ echo

    ${toto%%${pattern1%$pattern2}$expand}

    /users/pet

    $

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ ls

    toto1.c toto2.c toto_base.c tutu

    $ echo $(ls) $(echo $PWD)

    toto1.c toto2.c toto_base.c tutu $PWD

  • 8/8/2019 Guide Korn Shell - FR

    42/240

    page 42 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.4.

    jfpujol,18aot1993

    Il est possible de faire des redirections, pour rcuprer un message derreur, par exemple :

    Si on dcompose linterprtation de la premire ligne donne en exemple ci-dessus,

    - la variable res est affecte avec la sortie standard de la commande ls truc, cest dire rien puisque le fichier truc nexiste pas dans le rpertoire courant. La ligne vide quiapparait est le rsultat de la commande echo $res, puisque la variable res est vide.

    On remarque cependant que le message truc not found apparait : cela vient du fait quela sortie derreur de la commande ls truc est hrite du shell, cest donc la console.

    Si on dcompose la deuxime ligne donne en exemple, on constate que la seulediffrence vient de la redirection : la variable res est affecte avec la sortie standard dela commande ls truc, mais aussi avec sa sortie derreur ; le message derreur truc

    not found nest donc plus envoy vers la console, mais dans la variable res (quiest ensuite affiche).

    I.6.4. Etape 4 : Le caractre spcial double-quote "

    La chane de caractres comprise entre deux double-quotes formera un champ de la commandelmentaire qui sera lance, de la mme faon que pour les chanes encadres par des quotessimples. La diffrence avec le caractre simple quote est qu cette tape, les transformations des

    symboles de variables, et squence de $() ont dj t values. Par contre, les caractres spciaux *~ [] etc.. (voir tape 5) perdent leur signification sils sont placs entre double-quotes.

    On encadrera donc de double-quotes des chanes qui contiennent des variables, $(), etc... que leshell doit valuer, et de simples quotes les chanes qui ne doivent pas tre values.

    Les chanes encadres de double-quotes peuvent tre concatnes entre elles ou avec une autrechane en les accolant ; mme si elles contiennent des sparateurs, elles seront considres commeun champ unique lors de lappel final de la commande lmentaire.

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ lstoto1.c toto2.c toto_base.c tutu

    $ res=$(ls truc) ; echo $res

    truc not found

    $ res=$(ls truc 2>&1) ; echo $res

    truc not found

    $

  • 8/8/2019 Guide Korn Shell - FR

    43/240

    Guide du KornShell sous UNIX - page 43

    Description : Interprtation dune commande shell

    I.6.5.

    jfpujo

    l,

    18a

    ot1993

    Un caractre quote lintrieur dune chane encadre par des doubles-quotes perd sasignification spciale ; linverse est vrai galement. Pour placer le caractre littral (passif) double-quote dans une chane elle-mme encadre par des double-quotes, on peut le protger par un \.

    On peut vrifier sur les exemples ci-dessus le rle des double-quotes. En particulier, le3me echo encadre son argument entre double-quotes : cela veut qu lintrieur, lesimple-quote perd sa signification, mais que les variables sont remplaces par leurvaleur; cest bien ce qui se passe pour le $PWD en bout de ligne.

    I.6.5. Etape 5 : Les caractres spciaux * [] ? ~ \

    Lorsquon dsigne un nom de fichier, il est souvent peu pratique dindiquer le nom ou le chemincomplet. Il existe des caractres spciaux qui permettent de dsigner symboliquement descaractres, ou des parties du nom de fichiers. Le shell recherche alors dans les rpertoires dsigns,ou par dfaut dans le rpertoire courant le ou les fichiers dont le nom est conforme la descriptionspcifie. Attention : on imagine souvent que cest la commande qui interprte ces caractres ; enfait, il sont transforms par le shell avant que la commande ne soit lance.

    Voici la correspondance :

    caractre * : nimporte quelle partie ou totalit du nom dun fichier ou derpertoire. Si plusieurs occurrences sont possibles, la chanecontenant * (galement nomme pouet) est tendue autant defois.

    $ echo ""$ echo ""$ echo "$PWD $(pwd) $PWD"/tmp /tmp /tmp$ echo "~ *"~ *$ echo ~ *

    /users/logis toto1.c toto2.c tutu$ echo " $RANDOM"===="12 34"5631079====12 3456

  • 8/8/2019 Guide Korn Shell - FR

    44/240

    page 44 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.5.

    jfpujol,18aot1993

    Exemple :

    caractre ? : un caractre quelconque.

    Exemple :

    squence [ ] : un caractre parmi ceux spcifis entre les crochets.

    [12] : le caractre 1 ou 2

    [1-5] : le caractre 1 ou 2 ou 3 ou 4 ou 5[A-] : un caractre parmi la liste des caractres ascii de rangsuprieur ou gal A.

    [!1-5] : un caractre parmi les caractres ascii qui ne font paspartie de lensemble des caractres de 1 5.

    Exemple :

    caractre ~ : le chemin absolu du rpertoire courant au moment de votrelogin (home directory). Si ~ prcde un nom dutilisateur,alors cela reprsente le chemin absolu du home directory delutilisateur.

    $ ls

    toto1.c toto2.c toto_base.c tutu$ echo toto*.c

    toto1.c toto2.c toto_base.c

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto?.ctoto1.c toto2.c

    $ lstoto1.c toto2.c toto_base.c tutu

    $ echo toto?.c

    toto1.c toto2.c

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ ls

    toto1.c toto2.c toto_base.c tutu

    $ echo toto[!_].c

    toto1.c toto2.c

  • 8/8/2019 Guide Korn Shell - FR

    45/240

  • 8/8/2019 Guide Korn Shell - FR

    46/240

    page 46 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.6.

    jfpujol,18aot1993

    !(expression)

    !(expression1|expression2|...)

    est remplac par toutes les occurrences possibles sauf celles correspondantaux expressions fournies.

    Exemples :

    Il est rappel que les expressions sont values en fonction des noms de fichiers qui existentdans le rpertoire courant si lexpression ne contient pas de caractre /, et dans le rpertoire indiqusinon.

    I.6.6. Etape 6 : les squences () et {}

    Il est possible de fabriquer une macro-commande partir de plusieurs commandeslmentaires ; une macro-commande est encadre par des () ou des {}, et se comporte comme unecommande normale : par exemple, on peut rediriger ses entres et ses sorties.

    Si on dsire que la macro-commande sexcute dans lenvironnement courant, on utilisera les{} ; si on prfre quelle sxcute dans un environnement spar, on utilisera les () ; en pratique,cest cette configuration qui est la plus intressante.

    $ lsessai1 essai1.c toto1.c toto_base.cessai1.0 essai2 toto22.c tyty$ echo !(toto*)essai1 essai1.0 essai1.c essai2 tyty$ echo +(to)*toto1.c toto22.c toto_base.c

    $ echo essai1?(.c)essai1 essai1.c$ echo *+([0-9]).cessai1.c toto1.c toto22.c$

  • 8/8/2019 Guide Korn Shell - FR

    47/240

    Guide du KornShell sous UNIX - page 47

    Description : Interprtation dune commande shell

    I.6.7.

    jfpujo

    l,

    18a

    ot1993

    Exemple :

    Vous constatez que le changement de rpertoire est local pour une macro-commandeencadre par des (), alors quelle continue garder son effet lorsquon utilise des {}.

    De plus, la syntaxe de la macro-commande est un peu plus rigide si on utilise des {} : ilfaut isoler les { } entre des espaces et faire suivre chaque commande par un pointvirgule.

    I.6.7. Etape 7 : Les caractres spciaux ; | && & |

    Ces caractres (ou squences) dfinissent la fin dune commande lmentaire. On peut donccomposer une ligne shell par plusieurs commandes lmentaires spares par un de ces caractres ;suivant le choix du caractre, lintraction entre les deux commandes contigus sera diffrente.

    1.6.7.1. caractre ;

    Ce caractre peut tre considr comme un oprateur squentiel : les deux commandescontigus sont excutes lune aprs lautre (la seconde dmarre lorsque la premire est termine).

    Leffet est le mme si on place les deux commandes lune aprs lautre sur deux lignesconscutives du programme.

    1.6.7.2. squence ||

    Dans le cas o deux commandes sont spares par des ||, la deuxime nest excute que si lapremire choue, cest dire si son code de retour est diffrent de zro.1

    1. Des exemples sont visibles au chapitre sur les expressions conditionnelles. Voir page 71

    $ pwd; (cd /usr/pub/; pwd ; ls); pwd/tmp/usr/pubascii eqnchar/tmp$ pwd; { cd /usr/pub/; pwd ; ls ; }; pwd/tmp/usr/pubascii eqnchar/usr/pub$

  • 8/8/2019 Guide Korn Shell - FR

    48/240

    page 48 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.7.

    jfpujol,18aot1993

    1.6.7.3. squence &&

    Dans le cas o deux commandes sont spares par des &&, la deuxime nest excute que si lapremire russit, cest dire si son code de retour est gal zro1.

    1.6.7.4. caractre &

    Ce caractre peut tre considr comme un oprateur asynchrone (parallle) ; le shell nattendpas la fin de la commande prcdent le & pour lancer celle qui le suit. Par exemple, si la ligne decommande shell est de la forme :

    cmd1 & cmd2 & cmd3

    alors, la commande cmd1 est excute, puis sans attendre la fin de cmd1, la commande cmd2

    est lance, de mme la commande cmd3. Lorsque la commande cmd3 est finie, on passe la lignesuivante du programme.

    Autre exemple :

    cmd1 & cmd2 &

    la commande cmd1 est lance, puis sans attendre, la commande cmd2 aussi ; et comme elle estsuivie du &, le shell passe linterprtation de la ligne de programme suivante, sans attendre la finde cmd1 ni cmd2.

    Le fait de lancer une commande de manire asynchrone avec un & ncessite de crer unprocessus indpendant ; ce que nous avons dj vu sur lhritage est valable ici aussi (en particulierpour les redirections) ; nous verrons quil est possible depuis un shell interactif de garder un certaincontrle sur ce types de processus, appels aussi jobs.

    Il arrive quon nomme arrire plan ou background la classe de processus lancs de manireasynchrone, en opposition avec lavant plan ou foreground qui est la classe des processussexcutant squenciellement dans un programme.

    1.6.7.5. le caractre | ou pipe

    Cet oprateur permet de lancer les deux commandes contigus en reliant la sortie standard(descripteur 1) de la premire commande dans lentre standard (descripteur 0) de la seconde. Lenom pipe donne lide dun tuyau par lequel les donnes transitent dune commande lautre.

    Il est possible ainsi de chaner autant de commandes que lon dsire, le seul impratif tant quechacune des commandes lise les donnes dentre sur le descripteur 0 et fournisse les rsultats sur ledescripteur 1 (ventuellement aprs une redirection).

    Les deux ou N commandes relies par des pipes sont dmarres simultanment dans autant deprocessus diffrents et disparaissent une une lorsque leur entre standard est vide. Le shell passe

    1. Voir les expressions conditionnelles: page 71

  • 8/8/2019 Guide Korn Shell - FR

    49/240

    Guide du KornShell sous UNIX - page 49

    Description : Interprtation dune commande shell

    I.6.8.

    jfpujo

    l,

    18a

    ot1993

    lexcution de la commande ou de la ligne de programme suivante lorsque toutes les commandeslies par des pipes ont disparu.

    Lexemple ci-dessus est bien compliqu pour le rsultat escompt, mais il montrecomment il est possible de combiner plusieurs commande UNIX pour en constituer une

    plus puissante ou mieux adapte au besoin courant.

    Dans ce cas, on met jour leffet des redirections :

    - la premire ligne de lexemple consiste piper une commande qui gnre desmessages derreur dans une autre (wc -l compte les lignes de lentre standard).Comme les fichiers toto et tata nexistent pas dans le rpertoire courant, lacommande ls ne fournit rien sur la sortie standard, et deux messages apparaissent surla sortie derreur, un pour le fichier toto et un pour le fichier tata ; ayant hrit desdescripteurs du shell intractif, ces messages sont envoys sur la console et lacommande wc -l indique un nombre nul de lignes provenant de lentre standard.

    - la deuxime ligne est identique, ceci prs que, grce la redirection, les messages

    derreur sont redirigs dans lentre standard du pipe et que ces deux lignes sont biencomptes par la commande wc -l

    Il est possible de piper entre elles des commandes UNIX, des commandes internes du shell,mais aussi des macro-commandes, comme elles ont t dcrites au chapitre prcdent.

    I.6.8. Etape 8 : Les redirections

    Nous avons dj vu dans le chapitre sur les fichiers ce qutaient les redirections : une

    association entre un descripteur et un nom de fichier physique.

    $ lstoto1.c toto2.c toto_base.c tutu$ echo toto[^_].ctoto1.c toto2.c

    $ lstoto1.c toto2.c toto_base.c tutu$ ls | grep toto | sorttoto1.ctoto2.ctoto_base.c

    $ lstoto1.c toto2.c toto_base.c tutu$ ls toto tata | wc -ltoto not foundtata not found0

    $ ls toto tata 2>&1 | wc -l2

    voir

  • 8/8/2019 Guide Korn Shell - FR

    50/240

  • 8/8/2019 Guide Korn Shell - FR

    51/240

    Guide du KornShell sous UNIX - page 51

    Description : Interprtation dune commande shell

    I.6.8.

    jfpujo

    l,

    18a

    ot1993

    Il existe dautres types de combinaison, mais qui sont bien moins usits.

    Par exemple, il est possible de faire une redirection en mode entre-sortie (digitname),

    mais le mode sortie est en fait un mode ajout, ce qui nest pas vraiment intressant. De toute faon,la quasi-totalit des commandes UNIX nacceptent pas davoir des descripteurs dentre et de sortiequi pointent sur un mme fichier : on sera presque toujours oblig dutiliser un fichier intermdiairepour simuler le mode entre-sortie sur un fichier ouvert.

    Un bon usage des redirections ci-dessus permet dj beaucoup de manipulations dentres-sorties.

    Exemple 1 : plus de trois descripteurs pour une commande

    Pour cet exemple, on a crit un petit programme shell (dont le fichier se nommeessai1), qui lit des lignes sur le descripteur 4 et les recopie sur le descripteur 6.

    La premire commande lance (essai1 4

  • 8/8/2019 Guide Korn Shell - FR

    52/240

    page 52 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.8.

    jfpujol,18aot1993

    On peut suivre ltat des redirections sur le schma suivant :

    Le script essai1 est reli lors de son lancement au shell de la ligne de commande parles entre-sorties standard, puisque aucune redirection sur un des descripteurs 0, 1 ou 2na t spcifie ; Cependant, essai1, de par sa construction, lit ses donnes sur ledescripteur 4, vers lequel la redirection 4

  • 8/8/2019 Guide Korn Shell - FR

    53/240

    Guide du KornShell sous UNIX - page 53

    Description : Interprtation dune commande shell

    I.6.8.

    jfpujo

    l,

    18a

    ot1993

    Voici maintenant le schma correspondant la deuxime commande, o les redirections enentre et en sortie sont spcifies :

    Le programme essai1 peut maintenant crire sur le descripteur 6 qui est reli par laredirection 6>&1 au mme fichier physique que le descripteur 1, cest dire la console.

    Dans le cas ci-dessus, on voit que le shell a associ, comme toujours, les trois descripteursstandards 0, 1 et 2 au programme essai1 (en plus des descripteurs 4 et 6), sans savoir sils seraientutiliss ou non. Ici, rien nempcherait de rajouter dans le programme essai1 des commandesecho par exemple, qui criraient sur le descripteur 1 (donc vers la console) : les cinq descripteurssont disponibles.

    Exemple 2 : les redirections avec une macro-commande.

    La macro-commande ci-dessus permet dans le shell courant de crer un environnementspar dans lequel sont excutes les commandes cd /usr/pub et ls, cette

    1

    0

    2

    0

    2

    0

    1

    2

    toto1.c

    essai1

    ksh (ligne de commande)

    ksh (login)

    1

    4

    6

    read

    print

    $ pwd/users/logis/doc/manuell_shell/exemples$ ( cd /usr/pub ; ls >&4 ) 4>resu_ls$ pwd/users/logis/doc/manuell_shell/exemples$ more resu_lsascii eqnchar$

    voir

    voir

  • 8/8/2019 Guide Korn Shell - FR

    54/240

    page 54 - Guide du KornShell sous UNIX

    Description : Interprtation dune commande shell

    I.6.8.

    jfpujol,18aot1993

    commande envoyant son rsultat sur le descripteur 4. Le shell redirige le descripteur 4de la macro-commande vers le fichier physique resu_ls.

    Voici le schma correspondant :

    On sintresse ici uniquement aux redirections de la commande ls, la commande cdayant conserv les entres-sorties standard. On constate que la macro-commande secomporte au vu des redirections exactement de la mme manire quun script et quil estpossible de multiplier le nombre de descripteurs.

    En conclusion, on peut mettre sur une ligne autant de redirections que la commande concerne

    manipule de descripteurs, et vice-versa. Les commandes standards dUNIX en utilisentgnralement trois comme on la dj dit ; mais ces exemples montrent quil est possible den creravec plus de trois.

    La limite de 20 1 qui a t indique prcdemment est le nombre maximum de fichiers ouvertsquun processus peut possder ; cest une valeur paramtrable par ladministrateur de la station.

    1. voir la manipulation des fichiers page 21

    1

    0

    2

    0

    2

    0

    1

    2

    ksh (ligne de commande)

    ksh (login)

    1

    resu_ls

    ls

    (macro-commande)4

  • 8/8/2019 Guide Korn Shell - FR

    55/240

    Guide du KornShell sous UNIX - page 55

    Description : Interprtation dune commande shell

    I.6.9.

    jfpujo

    l,

    18a

    ot1993

    I.6.9. Etape 9 : La localisation de la commande

    A ce stade, on peut imaginer la ligne initiale une fois que toutes les transformationscorrespondant aux tapes 1 8 qui prcdent ont t ralises. Le premier champ de la ligne est alorsnormalement la commande.

    1.6.9.1. Les alias

    Un alias est une correspondance entre deux chanes de caractres. On peut renommer ou crerde nouvelles commandes en utilisant des alias.

    La premire chane est quelconque (mais sans sparateur) ; la deuxime est la chane (qui peut

    con