5 Jul
2007
5 Jul
'07
09:37
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 > 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 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.