[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [HS] Comportement bizarre de bash



--- François TOURDE <fra-duf-no-spam@tourde.org> a écrit :

> Le 13672ième jour après Epoch, fully associative-debian écrivait:
> 
> > Bonjour à tous.
> >
> > Je fais :
> >
> > toto@debian$ {count=10; echo $count}
> > 10
> > toto@debian$ echo $count
> > 10
> > toto@debian$ {count=12; echo $count}
> > 12
> > toto@debian$ echo $count
> > 12
> > toto@debian$ {count=9; echo $count}|less
> > 9
> > toto@debian$ echo $count
> > 12
> > toto@debian$ {count=9; echo $count}|xargs echo
> > 9
> > toto@debian$ echo $count
> > 12
> 
> Eh bien, tu en fais des choses :)
> 
> Ce qui est bien, c'est qu'avec tes tests tu as tous les moyens de
> comprendre tout ce qu'il se passe.
> 
> > Étonnant, non ?
> 
> Pas tant que ça en fait. En gros, dans tous les cas que tu testes
> sans
> le pipe, le shell ne va pas créer un nouveau process, les variables
> vont donc faire partie du shell interactif.
> 
> Par contre, dès lors que tu vas devoir lui faire manipuler les
> entrées
> sorties (en gros), alors le shell va créer un process pour pouvoir en
> changer les std*.

D'accord, je n'avais jamais remarqué...
Voilà ce que dit `man bash' à ce sujet :
<<
Conduites
Une  conduite  (pipeline)  est une suite d?une ou plusieurs
commandes séparées par le caractère tube |.
[...]
[Dans une conduite] Chaque commande dans une conduite est
exécutée comme  un  processus  indépendant  (c?est-à-dire
dans un sous-interpréteur).
>>

Donc, d'un point de vue pratique, pas facile de mélanger
les pipes et les xargs avec l'utilisation de variables ?
Un flot de données, mais aussi quelques données qui sont
accessibles n'importe où.

$ I=5; { I=4 ; export I; echo $I; }|xargs printf "$I ; %d\n"
5 ; 4

(le export ne donne rien, donc le preocessus 'après' le pipe
n'est pas un sous processus du premier.)

Vu qu'on ne peut pas utiliser de variable, les pipes sont,
peut être, parfois trop limités.
Cet incident m'a permis d'en savoir plus...
On peut par exemple faire ce genre de chose.

$ mkfifo tm1; mkfifo tmp2; { I=4 ; echo $I; echo toto; }|tee tmp1\
|tee tmp2>/dev/null & \
cat tmp1|grep '[0-9]'>>tmp2 & \
cat tmp2

Là ça pourrait se faire avec un sed, mais il y a peut être des
cas où ça pourrait être utile.

FA.

> À toi pour de nouveaux tests et de nouvelles expériences :)
> 
> -- 
> La vraie science est philosophique.
> 	-+- Max Born (1882-1970) -+-
> 
> 





      
	
		
___________________________________________________________________________ 
Découvrez une nouvelle façon d'obtenir des réponses à toutes vos questions ! 
Profitez des connaissances, des opinions et des expériences des internautes sur Yahoo! Questions/Réponses 
http://fr.answers.yahoo.com



Reply to: