Re: lire ds un fichier (en bash)

Top Page

Reply to this message
Author: Jean-Pierre Morin
Date:  
To: guilde
Subject: Re: lire ds un fichier (en bash)
Le Lundi 20 Octobre 2003 16:37, LIGIER Philippe a écrit :
> > > > 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.


Merci pour ces explications.

JPM