OVH Cloud OVH Cloud

[bash] expansion de variable avec double quote

18 réponses
Avatar
hd
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

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


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

8 réponses

1 2
Avatar
Jacques L'helgoualc'h
hd a écrit, mardi 6 janvier 2009, à 14:51 :
[...]



Bonjour,


$ MY_ARGS='--enable-debug CFLAGS="-g3 -O0"' bash -xv script.sh
#!/bin/sh



Plutôt « sh -xv », non ? Ton problème tient sans doute à l'ordre suivant
lequel le shell effectue ses évaluations --- tu pourrais demander sur
news:fr.comp.os.unix...

Pour contourner le problème, essaie

sh -vx <(sed -e '/${MY_ARGS}/ s//--enable-truc CFLAGS="-g3 -O0"/g' script.sh)

?

--
Jacques L'helgoualc'h

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
pmenier
hd a écrit :

Guy Roussin a écrit :


Pourriez vous m'indiquer la bonne syntaxe pour que bash fasse ... ce
que je voudrais qu'il fasse



et

MY_ARGS="--enable-truc CFLAGS="-g3 -O0"" ./script.sh

ça le fait ?



ben non, bash me transforme cela en
./configure --enable-truc 'CFLAGS="-g3' '-O0"'





Salut

Et si tu mets la valeur de MY_ARGS dans un fichier puis:

./configure $(cat le_fichier)

Pat

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Thomas Preud'homme
--nextPart2400233.aK2tGs5ko3
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

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 l igne.

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 suivan t
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, a nd
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 comma nde,
pas dans les variables. Toute quote dans une variable est considérée co mme un
caractère (c'est comme si la quote avait été échappée par le shel l).

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

--nextPart2400233.aK2tGs5ko3
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEABECAAYFAklkvSEACgkQuQM2KpxEui5exQCfZM7k4h1TAvq6PZz5SuXDhYDf
k0UAoIkaGGi6oToYjM6r1tHr+2b6D0iz
=g5yQ
-----END PGP SIGNATURE-----

--nextPart2400233.aK2tGs5ko3--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
hd
[...]
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}



merci pour toutes ces explications.
mais comme rien n'est simple, le script.sh en question ne dépend pas de
moi (fait par un tiers), je ne peux donc pas le modifier directement.
avec toutes les réponses à ce fil, j'en déduis qu'il n'y a pas de
solution en ne jouant que sur la définition de la variable.
donc je vais demander des modif ... dans script.sh

merci pour tout


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Thomas Preud'homme
--nextPart2591502.Rb88N3eq5u
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

The Wednesday 07 January 2009 17:18:56 hd, you wrote :
[...]

> 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}

merci pour toutes ces explications.
mais comme rien n'est simple, le script.sh en question ne dépend pas de
moi (fait par un tiers), je ne peux donc pas le modifier directement.
avec toutes les réponses à ce fil, j'en déduis qu'il n'y a pas de
solution en ne jouant que sur la définition de la variable.
donc je vais demander des modif ... dans script.sh

merci pour tout




Pas besoin. Regarde ma solution, je n'ai pas parlé de modifier script.sh

Juste tu dois écrire eval ./configure ${MY_ARGS} au lieu de ./configure
${MY_ARGS}

Cordialement,

Thomas Pred'homme
--
Why debian : http://www.debian.org/intro/why_debian

--nextPart2591502.Rb88N3eq5u
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEABECAAYFAklk59AACgkQuQM2KpxEui7aSQCfatavFVN+4OB8luk3Lm40HDqk
loYAnRR2HNchrf/A2PHn/3e1MTpi1JNK
=ST9K
-----END PGP SIGNATURE-----

--nextPart2591502.Rb88N3eq5u--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Arnaud Delobelle
2009/1/7 Thomas Preud'homme :
Pas besoin. Regarde ma solution, je n'ai pas parlé de modifier script.s h

Juste tu dois écrire eval ./configure ${MY_ARGS} au lieu de ./configure
${MY_ARGS}



Sauf que ./configure ${MY_ARGS} est dans le script...

--
Arnaud

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Thomas Preud'homme
--nextPart3396821.VEbfQlaag4
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

The Wednesday 07 January 2009 21:29:16 Arnaud Delobelle, you wrote :
2009/1/7 Thomas Preud'homme :
> Pas besoin. Regarde ma solution, je n'ai pas parlé de modifier script .sh
>
> Juste tu dois écrire eval ./configure ${MY_ARGS} au lieu de ./configu re
> ${MY_ARGS}

Sauf que ./configure ${MY_ARGS} est dans le script...

--
Arnaud




Ah oui en effet. Je vois pas comment faire d'autres alors.

Cordialement,

Thomas Preud'homme

--
Why debian : http://www.debian.org/intro/why_debian

--nextPart3396821.VEbfQlaag4
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEABECAAYFAkllIZ0ACgkQuQM2KpxEui4LGACdFAFDWPGZ/w8al2C3USWl7/+/
LUUAnRiXyXR5R1GlRRehYpF1ePpUKv3I
=ONBf
-----END PGP SIGNATURE-----

--nextPart3396821.VEbfQlaag4--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
fra-duf-no-spam
--=-=- Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Le 14251ième jour après Epoch,
Thomas Preud'homme écrivait:

The Wednesday 07 January 2009 21:29:16 Arnaud Delobelle, you wrote :
2009/1/7 Thomas Preud'homme :
> Pas besoin. Regarde ma solution, je n'ai pas parlé de modifier sc ript.sh
>
> Juste tu dois écrire eval ./configure ${MY_ARGS} au lieu de ./con figure
> ${MY_ARGS}

Sauf que ./configure ${MY_ARGS} est dans le script...

--
Arnaud




Ah oui en effet. Je vois pas comment faire d'autres alors.



Dans ce cas, et si seule la commande "configure" est sujette à
MY_ARGS, il faut:

1) renommer le configure en configure.real
2) créer un script "configure" qui fait un "eval ./configure.real $@"
3) lancer MY_ARGS='--whatever CFLAGS="-gX -oY"' ./script.sh

ça devrait le faire, mais j'ai pas testé

--=-=- Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iD8DBQFJZTjWjaoyFt0zqSURAtzGAJ43rtF1LhI5gUZmDWWvSZvYN5P/nACghAzt
hN3jCpO82jBoTvr3oZcUcjA =svY+
-----END PGP SIGNATURE-----
--=-=-=--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
1 2