Re: lire ds un fichier (en bash)

Top Page

Reply to this message
Author: LIGIER Philippe
Date:  
To: jeanpierre.morin, guilde
Subject: Re: lire ds un fichier (en bash)
> > > Oui, ca marche mais avec un inconvenient.
> > > Le "while" crée un sous-shell, ce qui fait que toutes les variables
> > > créees
> >
> > Tu es certain que la boucle while génère un sous-shell ?!!
>
> Oui, je viens de refaire les 2 tests ci-dessous:
>
> essai_1.sh ---------------
> VAR=1
> echo -e "Entre VAR=$VAR"
>
> cat $1 |  while read LIGNE
> do
> #       echo -e "LIGNE=$LIGNE"
>         echo -e "Boucle VAR=$VAR"
>         VAR=2
> done
> echo -e "Sortie VAR=$VAR"
> --------------------
> Ce qui donne à l'execution de : essai_1.sh essai_1.sh
> Entre VAR=1
> Boucle VAR=1
> Boucle VAR=2
> Boucle VAR=2
> Sortie VAR=1

>
> essai_2.sh --------------
> VAR=1
> echo -e "Entre VAR=$VAR"
> while read LIGNE
> do
> #       echo -e "LIGNE=$LIGNE"
>         echo -e "Boucle VAR=$VAR"
>         VAR=2
> done <$1
> echo -e "Sortie VAR=$VAR"
> --------------------
> Ce qui donne à l'execution de : essai_2.sh essai_2.sh
> Entre VAR=1
> Boucle VAR=1
> Boucle VAR=2

>
> Sortie VAR=2
>
> Dans essai_1.sh on voit qu'en sortie la variable VAR n'a pas été modifiée.
> La boucle est un process-fils qui herite de la variable VAR, mais le
> process-père ne recupère pas les variables du fils quand celui-ci meure.
> Dans essai_2.sh il n'y a pas de sous-shell de crée.
> Pour le cas qui nous interresse, il est préférable d'utiliser essai_2.sh
>


En fait tes essais confirment bien que la boucle 'while' ne créent pas de
processus (ouf).

Dans le cas de 'essai1.sh' ce n'est pas la boucle while qui crée un
sous-processus, mais plutot la manière de traiter les tubes par bash en
créant deux processus fils :

- un pour la commande cat qui ecrit dans le tube
- un pour la suite du processus afin de lire à l'autre bout du tuyau

Et c'est ce petit dernier qui garde pour lui les variables qu'il modifie (ça
c'est le fonctionnement standard des processus). L'essentiel est qu'il existe
une solution : celle utilisée dans essai2 en n'utilisant pas un tube, mais
une redirection sur la boucle while.