Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[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

10 réponses

1 2
Avatar
Régis Grison
hd a écrit :

Bonjour,

Je rencontre un problème avec l'expansion des variables sous bash

[...]
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"'
[...]



Là comme ça, je serais tenté de complètement contourner le problème :
dans le shell :
export CFLAGS="-g3 -O0"

ensuite tu peux lancer ton script avec dans la variable MY_ARGS :
MY_ARGS="--enable-truc ./script.sh"

Sinon, un truc auquel on ne pense pas toujours c'est l'argument -- qui
permet de séparer les arguments d'un appli des arguments de l'appli
passée en paramètres. Mais je pense que la solution est au dessus.

Régis.

--
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
Régis Grison a écrit :

hd a écrit :

Bonjour,

Je rencontre un problème avec l'expansion des variables sous bash

[...]
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"'
[...]



Là comme ça, je serais tenté de complètement contourner le problème :
dans le shell :
export CFLAGS="-g3 -O0"


oui mais le pb est que le "script.sh" bidouille lui-même le CFLAGS. Donc
mon CFLAGS déclaré en externe (via export) sera détruit entre temps

ensuite tu peux lancer ton script avec dans la variable MY_ARGS :
MY_ARGS="--enable-truc ./script.sh"


je suppose que tu voulais dire
MY_ARGS="--enable-truc" ./script.sh

Sinon, un truc auquel on ne pense pas toujours c'est l'argument -- qui
permet de séparer les arguments d'un appli des arguments de l'appli
passée en paramètres. Mais je pense que la solution est au dessus.


il me semble avoir déjà vu ça avec 'startx'
startx 'client param' -- 'server param'
mais dans ce cas, c'est 'startx' qui gère le '--' (qui le parse)
le '--' n'a pas de signification particulière pour bash à ma connaissance
est ce de cela dont tu veux parler ou évoques tu autre chose ?


Régis.



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
with a subject of "unsubscribe". Trouble? Contact
Avatar
Romaric DEFAUX
hd a écrit :

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




Bonjour,

As-tu déjà essayé de protégé les double quote par ?
MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh

--
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
Régis Grison
hd a écrit :

Régis Grison a écrit :

hd a écrit :

Bonjour,

Je rencontre un problème avec l'expansion des variables sous bash

[...]
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"'
[...]



Là comme ça, je serais tenté de complètement contourner le problème :
dans le shell :
export CFLAGS="-g3 -O0"


oui mais le pb est que le "script.sh" bidouille lui-même le CFLAGS.
Donc mon CFLAGS déclaré en externe (via export) sera détruit entre temps


Heu... si script.sh bidouille le CFLAGS, je ne suis pas sûr que le
passer comme tu veux le faire marche mieux, si ?


ensuite tu peux lancer ton script avec dans la variable MY_ARGS :
MY_ARGS="--enable-truc ./script.sh"


je suppose que tu voulais dire
MY_ARGS="--enable-truc" ./script.sh


Là je suis un peu paumé, si tu mets des "" juste autour d'un argument,
ne pas en mettre du tout ferait la même chose, non ?

Sinon, un truc auquel on ne pense pas toujours c'est l'argument --
qui permet de séparer les arguments d'un appli des arguments de
l'appli passée en paramètres. Mais je pense que la solution est au
dessus.


il me semble avoir déjà vu ça avec 'startx'
startx 'client param' -- 'server param'
mais dans ce cas, c'est 'startx' qui gère le '--' (qui le parse)
le '--' n'a pas de signification particulière pour bash à ma connaissance
est ce de cela dont tu veux parler ou évoques tu autre chose ?


Je veux bien parler de ça mais il me semble que c'est géré au niveau du
shell :
:~$ echo -n test
:~$ echo -- -n test
-- -n test
:~$

Ceci dit, je ne penses toujours pas que ça soit la solution. La
proposition de Romaric DEFAUX de mettre des " me semble beaucoup plus
intéressante.

Régis.

--
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
Romaric DEFAUX a écrit :


hd a écrit :

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




Bonjour,

As-tu déjà essayé de protégé les double quote par ?
MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh


ben oui ... et dans ce cas il le protège tellement que le '' est aussi
passé en param
MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh
se transforme en
./configure --enable-truc 'CFLAGS="-g3' '-O0"'

donc ce n'est pas bon ...




--
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
[...]

Là comme ça, je serais tenté de complètement contourner le problème :
dans le shell :
export CFLAGS="-g3 -O0"


oui mais le pb est que le "script.sh" bidouille lui-même le CFLAGS.
Donc mon CFLAGS déclaré en externe (via export) sera détruit entre temps


Heu... si script.sh bidouille le CFLAGS, je ne suis pas sûr que le
passer comme tu veux le faire marche mieux, si ?


dans le cript, il y a
...
CFLAGS ./configure ${MY_ARGS}
...

donc le CFLAGS défini via MY_ARGS est protégé (il "passe par dessus" en
quelque sorte)


ensuite tu peux lancer ton script avec dans la variable MY_ARGS :
MY_ARGS="--enable-truc ./script.sh"


je suppose que tu voulais dire
MY_ARGS="--enable-truc" ./script.sh


Là je suis un peu paumé, si tu mets des "" juste autour d'un argument,
ne pas en mettre du tout ferait la même chose, non ?


si mais ce n'est pas ce que tu avais écrit, c'est pour cela que je
posais la question

[...]

Je veux bien parler de ça mais il me semble que c'est géré au niveau
du shell :
:~$ echo -n test
:~$ echo -- -n test
-- -n test
:~$


effectivement en relisant le 'man bash', l'option '--' est géré
directement par bash, je ne l'avais pas compris
ceci dit j'ai essayé (sans trop comprendre)
MY_ARGS='--enable-truc -- CFLAGS=-g3 -O0' ./script.sh
et
MY_ARGS='--enable-truc -- "CFLAGS=-g3 -O0"' ./script.sh
sans succès, bash considère -O0 toujours que c'est un paramètre indépendant


Ceci dit, je ne penses toujours pas que ça soit la solution. La
proposition de Romaric DEFAUX de mettre des " me semble beaucoup plus
intéressante.


elle ne fonctionne malheureusement pas


--
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
Romaric DEFAUX
hd a écrit :

Romaric DEFAUX a écrit :


hd a écrit :

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




Bonjour,

As-tu déjà essayé de protégé les double quote par ?
MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh


ben oui ... et dans ce cas il le protège tellement que le '' est
aussi passé en param
MY_ARGS='--enable-truc CFLAGS="-g3 -O0"' ./script.sh
se transforme en
./configure --enable-truc 'CFLAGS="-g3' '-O0"'
donc ce n'est pas bon ...



J'ai l'impression que c'est l'espace entre -g3 et -00 qui pose problème.
Il considèrerait que MY_ARGS contient une suite d'arguments séparés par
des espaces. Et si tu protèges l'espace ça fait quoi ?
Tu pourrais nous montrer les parties de script.sh qui traite MY_ARGS et
CFLAGS ? Il y a peut-être un bug...


--
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
Guy Roussin
> 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 ?

--
Guy

--
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
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"'



--
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
Romaric DEFAUX a écrit :
[...]

J'ai l'impression que c'est l'espace entre -g3 et -00 qui pose
problème. Il considèrerait que MY_ARGS contient une suite d'arguments
séparés par des espaces. Et si tu protèges l'espace ça fait quoi ?
Tu pourrais nous montrer les parties de script.sh qui traite MY_ARGS
et CFLAGS ? Il y a peut-être un bug...


ce script permet normalement de lancer les outils autotools puis le
"configure" avec des options prédéfinis (path pour les bins, libs ...)
il utilise une variable MY_ARGS qui permet de surcharger les options de
'l'extérieur' du script sans avoir à le modifier
dans mon cas, je veux compiler en debug et donc ajouter les options
'--enable-debug CFLAGS="-g3 -O0"'
si je suis obliger de modifier le script pour cela, la variable MY_VARS
ne sert plus à rien ...
voici un raccourci du script

$ cat script.sh
#!/bin/sh

mylog() {
echo "${@}"
"${@}"
return $?
}

myconf() {
# ...
# differentes chose comme autoreconf ...
# ...
mylog "./configure" "${@}" ${MY_ARGS}
# ...
}
myconf --sbindir=/usr/sbin

et voici une trace :

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

mylog() {
echo "${@}"
"${@}"
return $?
}

myconf() {
# ...
# différentes chose comme autoreconf ...
# ...
mylog "./configure" "${@}" ${MY_ARGS}
# ...
}

myconf --sbindir=/usr/sbin
+ myconf --sbindir=/usr/sbin
+ mylog ./configure --sbindir=/usr/sbin --enable-debug 'CFLAGS="-g3' '-O0"'
+ echo ./configure --sbindir=/usr/sbin --enable-debug 'CFLAGS="-g3' '-O0"'
./configure --sbindir=/usr/sbin --enable-debug CFLAGS="-g3 -O0"
+ ./configure --sbindir=/usr/sbin --enable-debug 'CFLAGS="-g3' '-O0"'
configure: error: unrecognized option: -O0"

Visiblement, l'espace entre -g3 et -O0 pose problème

Je vais me replonger dans la doc de bash ...



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