bash, script et les paramètres de commandes externes
5 réponses
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 :
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
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 :
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"
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
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 ?
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
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
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).
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
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 :
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 :
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 :