Cours Unix 5

Document Sample
scope of work template
							                    Cours Unix 5

                           Michel Mauny


                                                                                                  La commande awk


                              ETGL


Le cours 4 est disponible sur http://quincy.inria.fr/courses/unix/

                                                                                                                                      [La commande awk – 2]

Plan du cours 5                                                               La commande awk


                                                                                        a
                                                                              Similaire ` sed, mais plus puissant.
                                                                              Avec sed:
                                                                                             e                   e e
                                                                               • difficile de m´moriser la ligne pr´c´dente
                                                                                                         e
                                                                               • on ne peut aller en arri`re dans le fichier
 1. La commande awk
                                                                                                 e
                                                                               • on ne peut pas s´lectionner une ligne par quelque chose
 2. La commande make                                                             comme /.../+1
                                                                                                                      e
                                                                               • rien pour effectuer des calculs arithm´tiques
                                                                              La commande awk, dont les auteurs sont Aho, Weinberger et
                                                                              Kernighan, permet ce genre choses. . .
                                                                     [ – 1]                                                           [La commande awk – 3]
La commande awk                                                                  Invocation

awk est un filtre programmable qui travaille aussi bien avec des
   ınes qu’avec des nombres.
chaˆ                                                                             Invocations:
awk traite des champs alors que sed traite des lignes.
                                                                                  • awk ’programme’ fichier ...: le programme est donn´    e
Tout comme sed et comme de nombreux outils Unix, awk traite                         sur la ligne de commande. Les fichier ... sont les fichiers
        e e
des donn´es ´manant de                                                              a
                                                                                    ` traiter.
 • fichiers                                                                                                                  e
                                                                                  • awk ’programme’: idem, mais c’est l’entr´e standard qui est
 • redirections et pilelines                                                             e
                                                                                    trait´e.
         e
 • l’entr´e standard.                                                                                                                  e
                                                                                  • awk -f pfichier fichier ...: le programme est trouv´
Tout comme sed, awk est un langage de motifs-actions, mais                          dans pfichier.
avec une syntaxe plus proche de C.
                                                         [La commande awk – 4]                                                            [La commande awk – 6]

La commande awk                                                                  Motifs et actions

                             e
Un programme awk est constitu´ de:
                                        e e
1. un segment optionnel BEGIN: action ex´cut´e avant la lecture
   de l’entr´e
            e                                                                              a
                                                                                 Similaire ` sed:
                                               e e
2. des paires motif-action: les actions sont ex´cut´es sur chaque                 • Chercher des motifs dans un ensemble de fichiers.
             e
   motif filtr´
                                                                                      e                    e e
                                                                                  • Ex´cuter les actions sp´cifi´es sur les lignes ou champs
                                      e e       e
3. un segment optionnel END: action ex´cut´e apr`s la fin de la                      contenant des occurrences de ces motifs.
   lecture
                                                                                                            e e
                                                                                  • Traite une ligne (plus g´n´ralement un enregistrement – cf.
                        BEGIN   { action }
                        motif   { action }                                                     a
                                                                                    plus loin) ` la fois.
                        ...
                        motif   { action }
                        END {   action }
                                                         [La commande awk – 5]                                                            [La commande awk – 7]
Motifs et actions                                                                Actions

                                                                                                     e                      a
                                                                                 Une instruction ou s´quence d’instructions ` la C.
BEGIN { action } optionnel, pour imprimer un message et/ou                       Exemple:
   initialiser de variables, par exemple.
                                                                                 $ ls | awk ’
motif { action } l’un au moins de motif et { action } doit                         BEGIN    { print "Les fichiers PDF sont:" }
   e      e
   ˆtre pr´sent.                                                                   /\.pdf$/ { print }
                                          e e e a
    • si motif est absent, { action } est ´x´cut´e ` chaque                        END                      a
                                                                                            { print "Et voil`!" }
      ligne;                                                                       ’
    • si { action } est absent, la ligne est imprim´e.
                                                   e                              Les fichiers PDF sont:
                                                                                  cours1.pdf
END { action } optionnel, pour imprimer un message.                               ...
                                                                                         a
                                                                                  Et voil`!
                                                         [La commande awk – 8]                                                            [La commande awk – 10]

Motifs                                                                            e
                                                                                 D´finition et usage de variables

                                                                                                                               e
                                                                                 Un programme awk qui compte les lignes en entr´e:
                                                                                   BEGIN { total = 0 }
                               e
Les motifs agissent comme des s´lecteurs:                                                { total ++ }
                        e
BEGIN ou END : motifs sp´ciaux.                                                    END   { print total }

                      e e
/regexpr/ expression r´guli`re.
                                                                                                            e e
                                                                                 Certaines variables sont pr´d´finies:
  e
pr´dicat par exemple x > 0
                                                                                                                e
                                                                                  • RS (record separator). Par d´faut, c’est <NEWLINE> (not´ e
motif && motif , (ou ||),                                                                          e                                 e e
                                                                                    \n), mais peut ˆtre n’importe quelle expression r´guli`re (le
   par exemple /ETGL/ && name == "Cours UNIX"                                                                   e a
                                                                                    changer dans l’action associ´e ` BEGIN);
                                                                                  • NR (number of records): nombre d’enregistrements lus
                                                                                    jusqu’alors.
                                                         [La commande awk – 9]                                                            [La commande awk – 11]
Champs                                                                            Imprimer

                    e           e
Chaque ligne en entr´e est divis´e en champs:
                             e
 • FS (field separator), par d´faut c’est [ \t]+
                        ıne                   e
    – Peut valoir la chaˆ vide (chaque caract`re est alors un
                                                                                         e
                                                                                   • le r´sultat de calculs
                            e                       e e
      champ), un seul caract`re, ou une expression r´guli`re.
                                                                                      – { print $1, $2 * $3 }
           e         e
    – Peut ˆtre chang´ dans l’action du BEGIN
                                                                                      – { print "la dette de" $1, "est", $2 * $3 }
           e      e e
    – Peut ˆtre sp´cifi´ par awk -Fr pour changer FS en r
                                                                                  Il existe aussi une commande printf qui permet de formatter les
                       e
 • $0 est la ligne enti`re, $1, $2, . . . , les champs
                                                                                  impressions (similaire au printf de C).
Attention: seuls les noms de champs commencent par $, les
                            e
autres variables sont utilis´es comme dans un langage de
programmation habituel (au contraire du shell).
                                                         [La commande awk – 12]                                                         [La commande awk – 14]

Imprimer                                                                           e
                                                                                  S´lection

Imprimer:
                                                                                  Comparaison:
 • chaque ligne:
                                                                                   • $2 >= 5 { print }
    – awk ’{ print }’ ...
                                                                                   • $2 * $3 > 50 { printf("%6.2f pour %s\n", $2 * $3, $1) }
    – awk ’{ print $0 }’ ...
                                                                                  Filtrage de texte:
 • certains champs:
                                                                                   • $1 == "ETGL"
    – awk ’{ print $1, $3 }’ ...                                                   • /ETGL/
    – awk ’{ print $1, $NF }’ ... (le $ accepte une
                                                                                  Combinaison de motifs:
                       e
      expression arithm´tique)
                                                                                   • $2 >= 4 || $3 >= 20
    – awk ’{ print NF, $1, $(NF-2) }’ ... imprime le                               • NR >= 10 && NR <= 20
                                                  e e     e
      nombre de champs, le premier champ, et l’ant´p´nulti`me
                                                         [La commande awk – 13]                                                         [La commande awk – 15]
Variables                                                                                                e e
                                                                                    Quelques fonctions pr´d´finies



                                                                                     • length(s)
                                                                                           { nc = nc + length($0) + 1
 • Les variables de awk sont vues comme de type num´rique ou
                                                   e                                         nw = nw + NF }
   texte selon le contexte.                                                            END { print NR, "lines,", nw, "words,", nc, "chars" }

 • Elles n’ont pas besoin d’ˆtre d´clar´es, et valent soit 0 soit la
                            e     e e                                                                                        ıne
                                                                                     • substr(s,i,len) produit la sous-chaˆ de s commen¸ant  c
                                                                                       au i e
                                                                                           `me caract`re et de longueur au plus ´gale ` len.
                                                                                                     e                          e     a
       ıne
   chaˆ vide, selon le contexte.
                                                                                     • tolower(s)
                                                                                     • toupper(s)


                                                           [La commande awk – 16]                                                        [La commande awk – 18]

                   ınes
Manipulation de chaˆ                                                                                   o
                                                                                    Structures de contrˆle




 • La concat´nation de chaˆ
            e             ınes se note par juxtaposition:                           Conditionnelle:
            { names = names $1 " " }                                                $2 > 1 { n = n + 1; dette = dette + $2 * $3 }
        END { print names }
                                                                                    END { if (n > 0)
                    e
 • Imprimer la derni`re ligne.                                                                            e
                                                                                               print n, "d´biteurs multiples, de dette dotale:",
   NR garde sa valeur apr`s la derni`re lecture, mais pas $0:
                         e          e                                                                dette, "-- moyenne: ", dette/n
                                                                                          else
            { last = $0 }                                                                                    e                  e
                                                                                               print "aucun d´biteur n’a emprunt´ plus d’une fois"
        END { print last }                                                              }



                                                           [La commande awk – 17]                                                        [La commande awk – 19]
                   o
Structures de contrˆle                                                                   e
                                                                       Structures de donn´es: tableaux


Boucle while:
                                                                              ee                                e e
                                                                        • Les ´l´ments de tableaux ne sont pas d´clar´s
# interest1 - compute compound interest
#   input: amount, rate, years                                                                            e
                                                                        • Les indices de tableaux peuvent ˆtre
#   output: compound value at end of each year                             – des nombres
     { i = 1
                                                                                    ınes (tableaux associatifs)
                                                                           – des chaˆ
        while (i <= $3) {
          printf("\t%.2f\n", $1 * (1 + $2) ^ i)                         • Exemples:
          i = i + 1                                                        – tab[3]="une chaine"
          }                                                                – note["Jean"]=14.5
      }

                                              [La commande awk – 20]                                                        [La commande awk – 22]

                   o
Structures de contrˆle                                                 Exemple d’utilisation de tableaux



                                                                       # reverse
Boucle for:                                                                              e
                                                                       # - imprime l’entr´e dans l’ordre inverse des lignes
# interest2 - compute compound interest
#   input: amount, rate, years                                         { line[NR] = $0 }                      e
                                                                                                           # m´morise chaque ligne
#   output: compound value at end of each year
                                                                       END {
{ for (i = 1; i <= $3; i = i + 1)                                               for (i=NR; (i > 0); i=i-1) {
  printf("\t%.2f\n", $1 * (1 + $2) ^ i)                                           print line[i]
}                                                                               }
                                                                            }

                                              [La commande awk – 21]                                                        [La commande awk – 23]
Quelques exemples courts                                                          e
                                                                                Op´rateurs

 • /chaine/ { nlines = nlines + 1 }                                              • = affectation
      END   { print nlines }
                                                                                                  e     e
                                                                                 • ==, != tests d’´galit´
 • $1 > max { max = $1; maxline = $0 }
    END     { print max, maxline }                                                                           ı
                                                                                 • ~, !~ test de filtrage (cha^ne ~ /motif/ )
 • { temp = $1; $1 = $2; $2 = temp; print }                                      • && ||, conjonction, disjonction
 • { sum = 0                                                                          e
                                                                                 • ! n´gation
      for (i = 1; i <= NF; i = i + 1)
                                                                                 • <, >, <=, >=
            sum = sum + $i
      print sum                                                                  • +, -, /, *, %, ^
    }
                                                                                                        e             ıne
                                                                                 • juxtaposition: concat´nation de chaˆ

                                                       [La commande awk – 24]                                                                        [La commande awk – 26]

Quelques variables de awk                                                                   e e
                                                                                Functions pr´d´finies


                                                                                      e
                                                                                Arithm´tiques

 • $0, $1, $2, . . . , $NF                                                       • sin, cos, atan, . . .

 • NR – nombre d’enregistrements trait´s
                                      e                                            ınes
                                                                                Chaˆ
                                                                                                                              ınes, . . .
                                                                                 • length, substitution, recherche de sous-chaˆ
 • NF – nombre de champs dans l’enregistrement courant
                                                                                Impression
                                  e
 • FILENAME – nom du fichier d’entr´e courant
                                                                                 • print, printf
         e
 • FS – s´parateur de champs
                                                                                  e
                                                                                Sp´ciales
          e                                           e
 • OFS – s´parateur de champs en sortie (espace, par d´faut)
                                                                                             e
                                                                                 • system ex´cute une commande Unix (system("pwd"))
                                                                                           e                    e                    e a
                                                                                 • exit arrˆte la lecture, et ex´cute l’action associ´e ` END si elle existe.

                                                       [La commande awk – 25]                                                                        [La commande awk – 27]
                                                                                    La commande make



                                                                                                      e e                       e
                                                                                    Dans l’exemple pr´c´dent, on sait que prog d´pend de
                                                                                    version.h et de prog.c: toute modification de l’un ou de
                                                                                                           e e
                                                                                    l’autre implique de reg´n´rer prog.

                   La commande make
                                                                                    La commande make permet de:
                                                                                           e            e
                                                                                     • repr´senter ces d´pendances;
                                                                                                      e        a
                                                                                     • indiquer les op´rations ` effectuer pour refabriquer les cibles
                                                                                                                                 e
                                                                                       en cas de modification (de la date) des pr´requis.


                                                          [La commande make – 28]                                                            [La commande make – 30]

 e e     e
G´n´ralit´s                                                                                            e
                                                                                    La commande make: d´pendances

                a       e
De nombreuses tˆches (d´veloppement, production de                                       e        e                e
                                                                                    Une r`gle de d´pendance est not´e comme suit:
                  e               e         e e
documents, etc) n´cessitent des op´rations r´p´titives:
                                                                                             e          e
                                                                                    cible: pr´requis1 pr´requis2 ...
  $   emacs progr.c &          e
                             # ´dition
                                                                                    ------->action1
  $   cc -o ./prog prog.c            e
                             # test, ´dition et ...
  $   cc -o ./prog prog.c    # test, ´dition et ...
                                     e                                              ------->action2
  $   ...                                                                           ------->...
C’est encore pire si la modification d’un fichier a un impact sur                     Les lignes d’actions commencent obligatoirement par un
d’autres:                                                                                  e
                                                                                    caract`re tabulation.
                          e
  $ emacs version.h & # ´dition.                                                    Exemple:
                                           e
                # version.h contient le num´ro de version
                # et prog.c mentionne version.h                                     prog: version.h prog.c
  $ cc -o ./prog ./prog.c                                                           ------->cc -o prog prog.c
                                                          [La commande make – 29]                                                            [La commande make – 31]
La commande make                                                                   Exemple

                    e               e e             e
La description des d´pendances est g´n´ralement donn´e dans un                     $ cat Makefile
             e
fichier nomm´ makefile ou Makefile.
                                                                                    prog: f1.o f2.o f3.o
$ cat Makefile                                                                     ------->cc -o prog f1.o f2.o f3.o
 prog: version.h prog.c
------->cc -o prog prog.c
                                                                                    f1.o: f1.c
$ make
 cc -o prog prog.c                                                                 ------->cc -c f1.c

            e         a                                a
Ici, prog n’´tait pas ` jour. La commande make l’a mis ` jour.
                                                                                    f2.o: f2.c i1.h
$ make                                                                             ------->cc -c f2.c
 make: ‘prog’ is up to date.

                a                            a
Ce second appel ` make remarque que prog est ` jour, et                             f3.o: f3.c i1.h i2.h
                   e
n’effectue aucune op´ration.                                                        ------->cc -c f3.c
                                                         [La commande make – 32]                                                                         [La commande make – 34]

Fonctionnement de make                                                             Exemple

´           e                     e            e
Etant donn´ un makefile (fichier d´crivant les d´pendances), et
une cible, make construit un graphe (acyclique) de d´pendances
                                                    e                                            e                e
                                                                                   Le graphe de d´pendances associ´ est:
pour cette cible:                                                                                                            prog
                                                                                                                     cc −o prog f1.o f2.o f3.o

                                 prog
                                                                                                            f1.o             f2.o                f3.o
                                                                                                        cc −c f1.c       cc −c f2.c        cc −c f3.c




              version.h                      prog.c


                              e
Les feuilles de ce graphe ne d´pendent de rien (sont toujours `a
                                           e               e
jour), et les nœuds sont reconstruits (si n´cessaire) en ex´cutant                       f1.c        f2.c            f3.c              i1.h             i2.h

               e e
les actions sp´cifi´es par le makefile.
                                                         [La commande make – 33]                                                                         [La commande make – 35]
La commande make                                                                  Make


                                                                                                                          e           a
                                                                                  make construit et traite le graphe de d´pendances ` partir de la
                                                                                       e                                    e e
                                                                                  premi`re cible (ou de la ou des cibles sp´cifi´es). Les cibles non
                                                                                          e                                  e
                                                                                  rencontr´es durant ce parcours sont ignor´es.
La commande make:                                                                 make utilise pour cela:
                   a      e e
 • automatise ces tˆches r´p´titives                                                      e                  e
                                                                                   • les r`gles explicites pr´sentes dans le makefile
                                  e         a         a
 • effectue le minimum de travail n´cessaire ` la mise ` jour des                          e                 e
                                                                                   • les r`gles de suffixes pr´sentes dans le makefile
   cibles
                                                                                             e                  e e
                                                                                   • et des r`gles implicites pr´d´finies
                                                                                                     e
                                                                                  Le traitement des r`gles est soumis a l’expansion des variables.
                                                                                                             e
                                                                                  Les commentaires sont ignor´s.
                                                        [La commande make – 36]                                                             [La commande make – 38]

Contenu d’un makefile                                                              Variables (macros)

Un makefile contient:                                                                                             e a                     e
                                                                                  Variables ou macros sont destin´es ` simplifier ou param´trer un
                                                                                  makefile.
                                  c
 • des commentaires (lignes commen¸ant par #)
                                                                                   e
                                                                                  D´finition:
        e                 e                     e
 • des r`gles (cible + pr´requis + actions), d´finissant des cibles
                                                                                    nom = valeur
   a                     e                       a e
   ` construire, leurs pr´requis, et les actions ` ex´cuter pour
   leur construction                                                                                    e             e
                                                                                  Les macros sont utilis´es dans les r`gles et dans les actions par:
                                                                                    $(nom)
         e                           e                        e
 • des d´finitions de variables (appel´es aussi macros), destin´es
                                                                                  ou bien par
   ae           e
   ` ˆtre utilis´es dans le makefile
                                                                                    ${nom}
        e                                e      e e
 • des r`gles de suffixes (suffix rules) ou r`gles g´n´riques,
                                                                                               u                                     e
                                                                                  Dans le cas o` le nom de la variable est monocaract`re, on peut
   indiquant comment produire un fichier avec un certain suffixe                     utiliser:
   a                        e                           e
   ` partir d’un fichier de mˆme nom avec un suffixe diff´rent.
                                                                                    $x
                                                        [La commande make – 37]                                                             [La commande make – 39]
Variables (suite)                                                                               e e
                                                                                    Variables pr´d´finies

Attention: les actions contiennent des commandes et des variables                                        e e
                                                                                    Les variables vues pr´c´demment ont une valeur “globale”
                 e            e                   e       e
shell. Les caract`res $ destin´s au shell doivent ˆtre not´s $$                                       a
                                                                                    (uniforme), c’est-`-dire que toutes leurs occurrences dans le
Exemple:                                                                                              e
                                                                                    makefile ont la mˆme valeur.
# Un exemple de Makefile                                                                                                 e                       e
                                                                                    La valeur d’une variable est recherch´e par make, par priorit´
BINDIR=/usr/local/bin
                                                                                     e
                                                                                    d´croissante, dans:
install: prog                                                                        1.   les arguments de make;
------->test -d $(BINDIR) && cp prog $(BINDIR)/prog || \                             2.                  e
                                                                                          les variables d´finies dans le makefile;
              cp prog $$HOME/bin/prog                                                3.   les variables d’environnement (les variables du shell);
prog: prog.c version.h                                                               4.                        e e
                                                                                          variables internes pr´d´finies.
------->...
                                                                                                                    e e
                                                                                    Il existe aussi des variables pr´d´finies, telles:
clean:
------->/bin/rm -f *.o *.c~ prog                                                      CC=cc
                                                          [La commande make – 40]                                                                   [La commande make – 42]

exemple                                                                             Variables non uniformes

                                                                                    Il existe des variables dont la valeur n’est pas uniforme mais varie
                                                e
Les noms de cibles, des listes d’objets peuvent ˆtre des variables:
                                                                                         e        e
                                                                                    de r`gle en r`gle.
EXE = prog
OBJ = main.o f1.o f3.o                                                                                   e                                  e
                                                                                    Elles permettent de d´signer la cible courante ou les pr´requis de
                                                                                    la cible courante:
$(EXE): $(OBJ)
                                                                                     • $@ le nom de la cible courante;
------->cc -o $(EXE) $(OBJ) -lm
                                                                                                      e             e
                                                                                     • $? liste des pr´requis plus r´cents que la cible.
                   e                  e             ıne
Les variables non d´finies sont remplac´es par la chaˆ vide.
                                                                                    prog: f1.c f2.c
                                 e        e
Les valeurs de variables peuvent ˆtre forc´es sur la ligne de                       ------->cc -o $@ f1.c fic2.c
commande (prenant le pas sur celles contenues dans le makefile):
                                                                                    prog: prog.c
$ make "EXE=testprog"
                                                                                    ------->cc -o $@ $?
                                                          [La commande make – 41]                                                                   [La commande make – 43]
R`gles de suffixes (dites aussi r`gles g´n´riques)
 e                             e      e e                                            Usage de make

                        e
On utilise souvent les mˆmes actions pour passer d’un fichier avec                    Syntaxe:
                               a
un certain suffixe (.c, par ex.) ` un fichier avec un autre (.o).
                                                                                       make     [options] [cible ...]
                            e      e e               c
make permet d’exprimer ces r`gles g´n´riques de la fa¸on
                                                                                     Options:
suivante:
                                                                                      • -f file utilise file comme makefile
.c.o:                                                                                 • -d imprime des informations de debug
------->echo Rebuilding $*.o from $*.c                                                           a                                     e
                                                                                      • -k met ` jour le plus possible de cibles interm´diaires (au lieu de
------->$(CC) -c $<                                                                          e     e          e
                                                                                        s’arrˆter d`s la premi`re erreur)
                                                                                      • -i ignore les codes de retour des actions
Ici,                                                                                                            a e                    e
                                                                                      • -n imprime les actions ` ex´cuter (sans les ex´cuter)
               e              e      e     e
 • $< est le pr´requis qui a d´clench´ la r`gle (le .c);
                                                                                                             e e                   e
                                                                                     Si aucune cible n’est sp´cifi´e, la cible par d´faut est celle de la
               e                                        e
 • $* est le pr´fixe de la cible (c’est aussi celui du pr´requis)                          e e
                                                                                     premi`re r`gle du makefile.
                                                           [La commande make – 44]                                                                     [La commande make – 46]

 e      e e
R`gles g´n´riques                                                                    Usage de make

           ıt                                  e
make connaˆ un certain nombre de suffixes et de r`gles                                                                 e
                                                                                     Si l’option -f file n’est pas pr´sente, make teste d’abord la
 e e          e e
g´n´riques pr´d´finies.                                                                 e                        e
                                                                                     pr´sence d’un fichier nomm´ makefile, puis celle de Makefile.
                                                  e       e e
Il est souvent plus clair d’effacer ces suffixes et r`gles pr´d´finies                     e
                                                                                     Ex´cution des actions:
                       e
pour en donner une d´finition explicite:
                                                                                                         e e
                                                                                     Chaque action est ex´cut´e dans un nouveau shell.
# On efface les suffixes connus
.SUFFIXES:                                                                                               e
                                                                                     Il ne faut donc pas ´crire:
            e
# Et on se d´finit les siens:
.SUFFIXES: .tex .dvi .pdf                                                            ------->cd quelque_part
# R`gles
   e                                                                                                  a   e
                                                                                     ------->commande ` ex´cuter
.tex.dvi:
------->latex $<                                                                     mais:
.dvi.pdf:
------->dvipdfm $<
                                                                                                                         a   e
                                                                                     ------->cd quelque_part && commande ` ex´cuter

                                                           [La commande make – 45]                                                                     [La commande make – 47]
make: erreurs communes


Erreurs courantes:
 • une ligne d’action ne commence pas par <TAB>
                                                    e
 • une action sur plusieurs lignes n’est pas continu´e par un \ en
   fin de ligne
                                      e                  ee
 • un $ dans une action qui est destin´ au shell n’a pas ´t´
        e
   doubl´ ($$)
                                e
 • une variable FOO de make est ´crite $FOO au lieu de $(FOO)
   ou ${FOO}
 • mauvaise utilisation des variables $@, $?, $<, . . .

                                                          [La commande make – 48]