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

bash, script et les paramètres de commandes externes

5 réponses
Avatar
smu
Bonjour,

Je continue à développer mon petit script qui permet de lancer des
opérations en fonction du contenu d'un fichier et je suis face à une
nouvelle difficulté.

Le contenu du fichier :

cmd1 optiona1 optionb1 -x"dir1_sans_espace"
cmd2 optiona2 optionb2 -x"dir2 avec espace"

Je récupère mes éléments de la manière suivante :

while read -r cmd optiona optionb dir
do
process_line "${cmd}" "${optiona}" "${optionb}" "${dir}"
done < $1

puis je les traite dans process_line tel que :

process_line()
{
cmd_extern ${1} ${2} ${3} ${4}
}

et là c'est le drame.

Lorsque j'exécute le script avec un "bash -x script.sh", je m'aperçois
que la ligne de commande est :

cmd_extern cmd1 optiona1 optionb1 '-x"dir1_sans_espace"'

et, bien sûr, la cmd_extern n'apprécie pas les quotes simples.

Question : Existe t-il un moyen de se débarasser des quotes simples pour
obtenir le résultat suivant ?

cmd_extern cmd1 optiona1 optionb1 -x"dir1_sans_espace"

D'avance merci

smu

5 réponses

Avatar
Thomas vO
bonjour,

À (at) Tue, 22 Jan 2008 12:41:42 +0100,
smu nous disait (told us):
Question : Existe t-il un moyen de se débarasser des quotes simples
pour obtenir le résultat suivant ?

cmd_extern cmd1 optiona1 optionb1 -x"dir1_sans_espace"


oui, avec un petit coup de sed sur la ligne en question :
sed s/'//g ...

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>

Avatar
Stephane Chazelas
On Tue, 22 Jan 2008 12:41:42 +0100, smu wrote:
[...]
Le contenu du fichier :

cmd1 optiona1 optionb1 -x"dir1_sans_espace"
cmd2 optiona2 optionb2 -x"dir2 avec espace"

Je récupère mes éléments de la manière suivante :

while read -r cmd optiona optionb dir
do
process_line "${cmd}" "${optiona}" "${optionb}" "${dir}"
done < $1

puis je les traite dans process_line tel que :

process_line()
{
cmd_extern ${1} ${2} ${3} ${4}


Laisser une variable sans ses quotes a une signification bien
particuliere pour le shell, ne jamais faire a moins d'avoir une
bonne raison.

cmd_extern "$1" "$2" "$3" "$4"
ou simplement:
cmd_extern "$@"

et là c'est le drame.

Lorsque j'exécute le script avec un "bash -x script.sh", je m'aperçois
que la ligne de commande est :

cmd_extern cmd1 optiona1 optionb1 '-x"dir1_sans_espace"'

et, bien sûr, la cmd_extern n'apprécie pas les quotes simples.
[...]


Ce ne sont pas le single quotes mais les double quotes qui
posent probleme.

Ces single-quotes ne sont affichees par bash -x pour montrer
comment la commande est lancee.

Quand tu tapes au prompt du shell

echo "a;b;c"

Les " ne sont pas passees a la commande echo. Ils ne sont la que
pour dire au shell que les caracteres a l'interieur ne doivent
pas etre traités specialement. echo recoit deux arguments:
« echo » et « a;b;c »

Ce que bash -x te dit, c'est que cmd_extern a ete appellee avec
ces arguments: « cmd_extern », « cmd1 », ...,
« -x"dir1_sans_espace" » y compris les double quotes.

J'ai l'impressions que ce que tu cherches est juste:

sed 's/^/cmd_extern /' < "$1" | sh

ou alors:

while read -r line; do
eval "cmd_extern $line"
done < "$1"

--
Stephane

Avatar
Jacques L'helgoualc'h
Le 22-01-2008, Thomas vO a écrit :
bonjour,


bonjour,

À (at) Tue, 22 Jan 2008 12:41:42 +0100,
smu nous disait (told us):
Question : Existe t-il un moyen de se débarasser des quotes simples
pour obtenir le résultat suivant ?

cmd_extern cmd1 optiona1 optionb1 -x"dir1_sans_espace"


oui, avec un petit coup de sed sur la ligne en question :
sed s/'//g ...


Plutôt quelque chose comme

sed -e "s/'(-x".*")'$/1/"

il pourrait y avoir des simples quotes ailleurs ?
--
Jacques L'helgoualc'h


Avatar
Stephane Chazelas
On 22 Jan 2008 13:35:13 GMT, Stephane Chazelas wrote:
[...]
J'ai l'impressions que ce que tu cherches est juste:

sed 's/^/cmd_extern /' < "$1" | sh
[...]


Ou tout simplement

xargs -L 1 cmd_extern < "$1"

La, c'est xargs qui interprete les ".." et '..' et . Note que
dans les cas speciaux, c'est legerement different de la facon
dont les shells les traite (et ca depend des implementations de
xargs).

--
Stephane

Avatar
smu
Bonjour,

Je continue à développer mon petit script qui permet de lancer des
opérations en fonction du contenu d'un fichier et je suis face à une
nouvelle difficulté.

Le contenu du fichier :

cmd1 optiona1 optionb1 -x"dir1_sans_espace"
cmd2 optiona2 optionb2 -x"dir2 avec espace"

Je récupère mes éléments de la manière suivante :

while read -r cmd optiona optionb dir
do
process_line "${cmd}" "${optiona}" "${optionb}" "${dir}"
done < $1

puis je les traite dans process_line tel que :

process_line()
{
cmd_extern ${1} ${2} ${3} ${4}
}

et là c'est le drame.

Lorsque j'exécute le script avec un "bash -x script.sh", je m'aperçois
que la ligne de commande est :

cmd_extern cmd1 optiona1 optionb1 '-x"dir1_sans_espace"'

et, bien sûr, la cmd_extern n'apprécie pas les quotes simples.

Question : Existe t-il un moyen de se débarasser des quotes simples pour
obtenir le résultat suivant ?

cmd_extern cmd1 optiona1 optionb1 -x"dir1_sans_espace"

D'avance merci

smu


Merci à tous

smu