bash, script et les paramètres de commandes externes

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thomas vO
Le #800453
bonjour,

À (at) Tue, 22 Jan 2008 12:41:42 +0100,
smu
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 -
Stephane Chazelas
Le #800452
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

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


bonjour,

À (at) Tue, 22 Jan 2008 12:41:42 +0100,
smu
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


Stephane Chazelas
Le #800450
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
Le #800449
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

Publicité
Poster une réponse
Anonyme