Année universitaire 2002-2003
espace

Licence d'informatique
Module 4 - partie "C / shell"


Travaux dirigés 11 :

  • 1. Description des commandes UNIX.
  • 2. Les métacaractères du shell.
  • 3. La commande ls.
  • 4. Exercice 1 : manipulations de métacaractères.
  • 5. La commande mkdir.
  • 6. La commande echo.
  • 7. Les expressions régulières.
  • 8. La commande grep.
  • 9. Redirection de l'entrée standard d'une commande.
  • 10. Redirections de la sortie standard d'une commande.
  • 11. Redirections de la sortie standard des erreurs.
  • 12. Exercice 2 : commande mkdir.

  • 1. Description des commandes UNIX.

    Un "shell" est un programme exécutable permettant d'interpréter les commandes du système d'exploitation UNIX. Il existe plusieurs versions de cet interpréteur : le "shell de Bourne", le "Korn shell", le "C shell", etc... On se placera dans le cadre du shell de Bourne.

    1.1. Les commandes UNIX les plus utiles.

    Dans les six séances de travaux dirigés et les trois séances de travaux pratiques restantes, trente-cinq commandes UNIX, parmi les plus utiles, seront décrites. Le tableau ci-dessous donne les noms de ces trente-cinq commandes, ainsi que les séances de travaux dirigés ou de travaux pratiques où elles seront décrites :

    cat   TD 12 cd      TP 8 chmod TD 12 cmp   TD 16 cp      TP 8
    cut   TD 12 date  TD 14 echo  TD 11 eval  TD 15 exit  TD 13
    expr  TD 13 find  TP 10 grep  TD 11 head  TD 14 kill  TD 13
    ls    TD 11 mail  TD 12 man     TP 8 mkdir TD 11 more    TP 8
    mv      TP 8 ps    TD 13 pwd     TP 8 read  TD 13 rm    TD 12
    rmdir   TP 8 set   TD 13 sh    TD 12 shift TD 15 sort    TP 8
    tail  TD 14 tee   TD 16 test  TD 13 tr    TD 12 wc    TD 12

    Le code exécutable de toutes ces commandes est situé dans le répertoire /usr/bin. Néanmoins, un certain nombre de ces commandes (par exemple : echo) existent également en tant que "commandes internes", c'est-à-dire que le code exécutable de ces commandes est également inclus dans le code de l'interpréteur de commandes lui-même. Dans ce cas, c'est la version "interne" qui est lancée, sauf si on écrit le chemin absolu de la commande externe (par exemple : /usr/bin/echo). C'est ce qui explique que les commandes internes puissent différer d'un shell à l'autre, alors que les commandes externes sont les mêmes pour tous les shells.

    1.2. Format d'une commande UNIX.

    Le format d'une commande UNIX suit toujours le modèle suivant :

    Chaque option est précédée d'un caractère - (plusieurs options peuvent être précédées d'un seul caractère -, si elles sont "collées"). Les options et les arguments forment ce que l'on appelle les "paramètres" de la commande (la liste des paramètres peut être vide pour certaines commandes). L'ordre des paramètres d'une commande est relativement libre, quoique soumis, quand même, à quelques contraintes.

    1.3. Les filtres et les autres commandes.

    Outre les paramètres (options et arguments), certaines commandes peuvent recevoir des données par l'intermédiaire d'une "unité logique" particulière, appelée "entrée standard" et notée stdin. Par défaut, "l'unité physique" correspondant à stdin est le clavier, mais on peut modifier cette unité physique par "redirection de l'entrée standard" (cf. le paragraphe 9).

    Par ailleurs, outre l'effet produit par leur exécution, certaines commandes peuvent fournir des résultats à deux unités logiques particulières, appelées "sortie standard" et "sortie standard des erreurs", et notées respectivement stdout et stderr. Par défaut, l'unité physique correspondant à ces deux unités logiques est l'écran, mais on peut également effectuer des "redirections de la sortie standard" (cf. le paragraphe 10) et des "redirections de la sortie standard des erreurs" (cf. le paragraphe 11).

    Une commande qui peut recevoir des données par l'intermédiaire de stdin et fournir des résultats à stdout est appelée un filtre. Les filtres présentent le gros avantage de pouvoir être "branchés" les uns à la suite des autres : en redirigeant la sortie standard du filtre filtre1 sur l'entrée standard du filtre filtre2, on peut réaliser un nouveau filtre, dont l'entrée standard est l'entrée standard de filtre1 et la sortie standard, la sortie standard de filtre2 (cf. le paragraphe 10).

    Remarquons enfin que certaines commandes, bien que ne pouvant pas fournir de résultats à stdout, peuvent recevoir des données par l'intermédiaire de stdin. Une telle commande peut être branchée sur la sortie d'un filtre, mais en aucun cas sur l'entrée d'un filtre. On dira d'une telle commande "qu'elle peut apparaître en fin de branchement". De façon équivalente, certaines commandes, bien que ne pouvant pas recevoir de données par l'intermédiaire de stdin, peuvent fournir des résultats à stdout. Une telle commande peut être branchée sur l'entrée d'un filtre, mais en aucun cas sur la sortie d'un filtre. On dira d'une telle commande "qu'elle peut apparaître en début de branchement".

    1.4. Conventions utilisées pour la description d'une commande UNIX.

    Les conventions suivantes ont été adoptées quant à la description des commandes UNIX :

    Caractéristiques :

    Syntaxes :

    Description :

    Exemples :

    Codes de retour :

    Remarques :

    2. Les métacaractères du shell.

    Les métacaractères du shell permettent :

    3. La commande ls.

    Caractéristiques :

    Syntaxes :

    Description :

    Exemple :

    Codes de retour :

    Remarque :

    4. Exercice 1.

    1) Écrire la commande permettant d'afficher les noms de fichiers non cachés dont le nom contient la lettre a.

    2) Écrire la commande permettant d'afficher les noms de fichiers dont le nom comporte quatre caractères exactement.

    3) Écrire la commande permettant d'afficher les noms de fichiers dont le nom comporte au moins cinq caractères.

    4) Écrire la commande permettant d'afficher les noms de fichiers dont le nom commence par une majuscule.

    5. La commande mkdir.

    Caractéristiques :

    Syntaxe :

    Description :

    Exemples :

    Codes de retour :

    6. La commande echo.

    Caractéristiques :

    Syntaxe :

    Description :

    Exemple :

    Codes de retour :

    Remarques :

    7. Les expressions régulières.

    On appelle "expression régulière" une chaîne de caractères composée de caractères normaux et de caractères spéciaux, appelés "métacaractères des expressions régulières" (à ne pas confondre avec les métacaractères du shell, décrits plus haut !). Une expression régulière désigne une séquence type de caractères ("pattern") que l'on recherche sur chaque ligne d'un fichier. Comme toutes les chaînes de caractères, on peut écrire une expression régulière entre apostrophes ', entre guillemets ", ou seule. Sauf dans les cas de nécessité contraire, on conseille d'utiliser la notation entre apostrophes, car alors les caractères $, *, \, etc... ne seront pas interprétés comme des métacaractères du shell. Les principaux métacaractères des expressions régulières sont les suivants :

    Remarque :

    Exemples :

    8. La commande grep.

    Caractéristiques :

    Syntaxe :

    Description :

    Exemple :

    Codes de retour :

    Remarques :

    9. Redirection de l'entrée standard d'une commande.

    9.1. Entrée standard par défaut d'une commande.

    Par défaut, l'unité physique correspondant à stdin est le clavier. La syntaxe permettant de transmettre un texte tapé au clavier à une commande, par l'intermédiaire de son entrée standard, est la suivante (les deux caractères < doivent être "collés") :

    La commande nom_commande reçoit le texte situé entre les deux occurrences du séparateur.

    Exemple :

    Il existe une autre manière de fournir du texte à une commande, par l'intermédiaire de son entrée standard. La syntaxe est la suivante, en reprenant l'exemple précédent :

    > grep 'e'
    bonjour,
    ceci est
    ceci est
    un exemple.
    un exemple.
    <Ctrl>D

    Remarques sur cette deuxième possibilité :

    9.2. Redirection de l'entrée standard d'une commande.

    Il est possible, sous UNIX, de rediriger l'entrée standard de la commande nom_commande, grâce à la syntaxe suivante :

    L'entrée standard de nom_commande est maintenant connectée au fichier nom_fichier

    Remarques :

    Exemple :

    10. Redirections de la sortie standard d'une commande.

    Il est également possible de rediriger la sortie standard d'une commande, qui est connectée par défaut à l'écran. Contrairement à la redirection de son entrée standard, la redirection de la sortie standard d'une commande peut être faite de quatre manières différentes :

    10.1. Redirection simple de la sortie standard d'une commande.

    La syntaxe est tout à fait similaire à celle de la redirection de l'entrée standard :

    Si le fichier nom_fichier n'existe pas, il est créé. Sinon, son contenu est écrasé par les affichages produits par la commande nom_commande

    Remarques :

    Exemple :

    10.2. Redirection de la sortie standard d'une commande avec concaténation.

    La syntaxe est la suivante :

    Si nom_fichier n'existe pas, il est créé. Dans tous les cas, le résultat de la commande nom_commande est ajouté ("concaténé") à la fin du fichier nom_fichier

    Remarques :

    Exemple :

    10.3. Redirection de la sortie standard d'une commande vers l'entrée standard d'une autre commande.

    On peut réaliser un "branchement" entre certaines commandes, selon la syntaxe suivante :

    Le métacaractère | est appelé "pipe" (qui signifie "tube" en anglais).

    Exemple :

    Remarque :

    10.4. Capture de la sortie standard d'une commande.

    On peut "capturer" les caractères envoyés par une commande sur sa sortie standard, pour les réutiliser dans la ligne de commande où elle apparaît, en entourant cette commande de métacaractères ` ("apostrophe à gauche", à ne pas confondre avec l'apostrophe '). Il est important de savoir qu'une capture remplace tous les caractères retour-chariot par des espaces.

    Exemple :

    Remarques :

    11. Redirections de la sortie standard des erreurs.

    Il est possible de rediriger la sortie standard des erreurs d'une commande sur un fichier, de l'une des deux manières suivantes :

    Remarques :

    12. Exercice 2.

    1) En une seule ligne de commande, créer le sous-répertoire REP1, et son sous-répertoire SREP1, dans le répertoire courant.

    2) En une seule ligne de commande, créer deux sous-répertoires REP2 et REP3 dans le répertoire courant, puis afficher le message : termine

    3) Même question, mais en envoyant ce message dans le fichier liste.txt


    Ces pages ont été réalisées par A. Crouzil, J.D. Durou et Ph. Joly.
    Pour tout commentaire, envoyer un mail à crouzil@irit.fr, à durou@irit.fr ou à Philippe.Joly@irit.fr.