Bonjour,
Je viens de m'arracher les cheveux sur des histoires de quoting et d'échappement.
La question est
Dans quel ordre le shell fait les substitutions de variable et les évaluation d'expressions dans
result="$(grep "$file" $FILELIST)"
?
Apparemment, c'est 1) " externes donc eval du $(...) 2) on passe à l'eval de grep "$file" $FILELIST 3) les variables sont substituées 4) grep est lancé 5) $(...) est substitué par le retour du grep 6) affectation de result
Mais j'aimerais confirmation, et surtout savoir si c'est spécifique à bash ou pas.
merci
Daniel
On Wed, Jul 04, 2007 at 06:22:21PM +0200, Daniel Caillibaud wrote:
La question est Dans quel ordre le shell fait les substitutions de variable et les évaluation d'expressions dans
result="$(grep "$file" $FILELIST)"
disons que file=bar FILELIST="foo faa fuu"
et que grep renvoie 'foo: bar'
je dirais
result="$(grep "$file" $FILELIST)" result="$(grep bar foo faa fuu )" result="foo: bar"
marc
Quoting Daniel Caillibaud ml@editionsdidier.com:
Bonjour,
Je viens de m'arracher les cheveux sur des histoires de quoting et d'échappement.
La question est
Dans quel ordre le shell fait les substitutions de variable et les évaluation d'expressions dans
result="$(grep "$file" $FILELIST)"
?
Apparemment, c'est
- " externes donc eval du $(...)
- on passe à l'eval de
grep "$file" $FILELIST 3) les variables sont substituées 4) grep est lancé 5) $(...) est substitué par le retour du grep 6) affectation de result
Mais j'aimerais confirmation, et surtout savoir si c'est spécifique à bash ou pas.
merci
Daniel
Bonjour,
Si tu veux vraiment faire un truc portable, il suffit de faire du script sh (et si possible pas avec un interpréteur qui linke vers dash ou bash, même si l'émulation est en général très correcte), donc pas de $(), mais des ``. Sinon pour ne pas se prendre la tête avec les compatibilités des divers shells, le plus simple reste de faire du perl (5) ou du python (bon ok, perl ne dispose pas de shell interactif et celui de python est limité (niveau autocomplétion), mais bon).
Par ailleurs sh -x répond à ta question et permet (entre autres) de s'assurer que les commandes sont exécutées dans le bon sens lors de l'écriture de certains scripts.
===== http://www.rt.com/man/sh.1.html -x xtrace Write each command to standard error (preceded by a '+ ') before it is executed. Useful for debugging. =====
===== $ theo@gauss:/tmp$ sh -x $ echo "line 1
line 2 line 3 line 4 line 5 etc My name is 5, Johny 5" > FILE
+ echo line 1 line 2 line 3 line 4 line 5 etc My name is 5, Johny 5 $ FILELIST=FILE + FILELIST=FILE $ MATCH=5 + MATCH=5 $ RESULT="`grep "$MATCH" $FILELIST`" + grep 5 FILE + RESULT=line 5 My name is 5, Johny 5 $ RESULT=`grep "$MATCH" $FILELIST` + grep 5 FILE + RESULT=line 5 My name is 5, Johny 5 $ MATCH="is 5" + MATCH=is 5 $ RESULT="`grep "$MATCH" $FILELIST`" + grep is 5 FILE + RESULT=My name is 5, Johny 5 $ RESULT="`grep $MATCH $FILELIST`" + grep is 5 FILE grep: 5: Aucun fichier ou répertoire de ce type + RESULT=FILE:My name is 5, Johny 5 =====
On voit bien l'ordre d'exécution et les doubles quotes extérieurs semble inutiles.
Bonne journée. -- theo.