IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Introduction à la programmation en Bash


précédentsommairesuivant

VI. Groupement de commandes

Le shell fournit deux mécanismes pour grouper l’exécution d’un ensemble de commandes sans pour cela affecter un nom à ce groupement :

  • l’insertion de la suite de commandes entre une paire d’accolades
  • l’insertion de cette suite de commandes entre une paire de parenthèses.
 
Sélectionnez
     { suite_cmds ; }

Insérée entre une paire d’accolades, la suite de commandes est exécutée dans le shell courant. Cela a pour effet de préserver les modifications apportées par la suite de commandes sur l’environnement du processus courant.

 
Sélectionnez
$ pwd
/home/sanchis			 => répertoire initial
$ { cd /bin ; pwd ; }            => changement du répertoire courant
/bin
$ pwd
/bin                             => répertoire final (le changement a été préservé !)
$

S’exécutant dans le shell courant, les modifications apportées aux variables sont également conservées :

 
Sélectionnez
$ a=bonjour
$ { a=coucou ; echo $a        ;}
coucou
$ echo $a
coucou
$

Les accolades { et } sont deux mots-clé de bash ; chacune d’elles doit donc être le premier mot d’une commande. Pour cela, chaque accolade doit être le premier mot de la ligne de commande ou bien être précédée d’un caractère ;. De plus, suite_cmds ne doit pas « coller » l’accolade ouvrante {. Par contre, la présence ou absence d’un caractère espace entre le caractère ; et le mot-clé } n’a aucune importance.

 
Sélectionnez
$ { cd /bin }                  => l’accolade } n’est pas le premier mot d’une commande
>                              => le shell ne détecte pas la fin du groupement
> ^C                           => control-C
$ {cd /bin ;}                  => il manque un espace ou une tabulation entre { et cd
-bash: syntax error near unexpected token `}'
$

Toutefois, lancée en arrière-plan, la suite de commandes n’est plus exécutée par le shell courant mais par un sous-shell.

 
Sélectionnez
$ pwd
 /home/sanchis                  => répertoire initial
 $ { echo processus : ; cd / ; ps ;} &
 processus :
 [1]      27963
 $
  PID   TTY           TIME     CMD
 27942 pts/14         00:00:00 bash
 27947 pts/14         00:00:00 bash
 27963 pts/14         00:00:00 ps
 [1] + Done                             { echo processus :; cd /; ps; }
 $
 $ pwd
 /home/sanchis		       => répertoire final
$

Bien qu’une commande cd / ait été exécutée, le répertoire courant n’a pas été modifié (/home/sanchis). Une utilisation fréquente du regroupement de commandes est la redirection globale de leur entrée ou sortie standard.

 
Sélectionnez
$ cat fich
premiere ligne
deuxieme ligne
troisieme ligne
quatrieme ligne
$ { read ligne1 ; read ligne2
> } < fich		          => le caractère > est affiché par le shell, indiquant
                                  => que l’accolade } est manquante
$ echo $ligne1
premiere ligne
$ echo $ligne2
deuxieme ligne
$

L’entrée standard des deux commandes read ligne1 et read ligne2 est globalement redirigée : elles liront séquentiellement le contenu du fichier fich. Si les commandes de lecture n’avaient pas été groupées, seule la première ligne de fich aurait été lue.

 
Sélectionnez
$ read ligne1 < fich ; read ligne2 < fich
$ echo $ligne1
premiere ligne
$ echo $ligne2
premiere ligne
$

Comme pour toutes commandes composées, lorsque plusieurs redirections de même type sont appliquées à la même suite de commandes, seule la redirection la plus proche est effective.

 
Sélectionnez
$ { read lig1 ; read -p "Entrez votre ligne : " lig2 </dev/tty
> read lig3
> } < fich
Entrez votre ligne : bonjour tout le monde
$ echo $lig1
premiere ligne
$ echo $lig2
bonjour tout le monde
$ echo $lig3
deuxieme ligne
$

Les commandes read lig1 et read lig3 lisent le contenu du fichier fich mais la commande read -p "Entrez votre ligne : " lig2 lit son entrée standard (/dev/tty).

 
Sélectionnez
       (suite_cmds)

Insérée entre une paire de parenthèses, la suite de commandes est exécutée dans un sous-shell. L’environnement du processus n’est pas modifié après exécution de la suite de commandes. Les parenthèses sont des opérateurs (et non des mots clé) : suite_cmds peut par conséquent coller une ou deux parenthèses sans provoquer une erreur de syntaxe.

 
Sélectionnez
$ pwd
/home/sanchis                   => répertoire initial
$ (cd /bin ; pwd)
/bin
$ pwd
/home/sanchis                   => le répertoire initial n’a pas été modifié
$ b=bonjour
$ ( b=coucou ; echo $b )
coucou
$ echo $b
bonjour                         => la valeur de la variable b n’a pas été modifiée
$

Ce type de groupement de commandes peut être aussi utilisé pour effectuer une redirection globale.

 
Sélectionnez
$ ( pwd ; date ; echo FIN ) > fin
$ cat fin
/home/sanchis
lundi 20 novembre 2006, 15:47:45 (UTC+0100)
FIN
$

précédentsommairesuivant

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.