quoting et sous-shell

Olivier theocrite at free.fr
Thu Jul 5 09:37:10 CEST 2007


Quoting Daniel Caillibaud <ml at 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 at 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.


More information about the Shell mailing list