The Tuesday 06 January 2009 09:57:41 hd, you wrote :
> Bonjour,
>
> Je rencontre un problème avec l'expansion des variables sous bash
>
> J'utilise un script (que je ne peux modifier car il fait partie d'un
> package tiers) qui lance un ./configure en lui passant des paramamètres
> additionnels via une variable MY_ARGS
>
> le script est quelque chose comme :
>
> #!/bin/sh
> ....
> ./configure ${MY_ARGS}
> ...
>
> et je le lance avec la commande :
> MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh
En fait les ' sont retirer par le shell au moment de l'évaluation de la ligne.
Au final il mettra dans MY_ARGS : --enable-truc CFLAGS="-g3 -O0" ./script.sh
Ensuite quand tu appelles configure avec $MY_ARGS la variable est remplacée
par sa signification (Cf ligne du dessus) et le découpage est fait suivant
les espaces sauf pour les variables qui étaient entre quites.
Cf man bash : Expansion is performed on the command line after it has
been split into words. There are seven kinds of expansion performed: brace
expansion, tilde expansion, parameter and variable expansion, command
substitution, arithmetic expansion, word splitting, and pathname expansion.
Puis plus loin :
The shell scans the results of parameter expansion, command substitution, and
arithmetic expansion that did not occur within double quotes for word
splitting.
Autrement dit les quotes ne sont interprétés que dans la ligne de commande,
pas dans les variables. Toute quote dans une variable est considérée comme un
caractère (c'est comme si la quote avait été échappée par le shell).
Si tu veux obtenir le résultat espéré tu vas devoir faire un eval :
val [arg ...]
The args are read and concatenated together into a single
command. This command is then read and executed by the shell, and its exit
status is returned as the value of eval. If there are no args, or only
null arguments, eval returns 0.
Ce qui dans ton cas donne :
MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh
puis
eval ./configure ${MY_ARGS}
>
> je m'attends à ce qu'il soit interprété comme :
> ./configure --enable-truc CFLAGS="-g3 -O0"
>
> mais bash le transforme en :
> ./configure --enable-truc 'CFLAGS="-g3' '-O0"'
> ce qui fait 3 paramètres pour "./configure" au lieu de 2
> et évidemment ./configure sort en erreur en indiquant qu'il ne comprend
> pas le paramètre -O0
>
> Pourriez vous m'indiquer la bonne syntaxe pour que bash fasse ... ce que
> je voudrais qu'il fasse
>
> merci
Cordialement,
Thomas Preud'homme
--
Why debian : http://www.debian.org/intro/why_debian
Attachment:
signature.asc
Description: This is a digitally signed message part.