2009-10-21 9 views
2

J'essaye d'exécuter un script Perl depuis un script bash (je changerai ce design plus tard, mais pour le moment, je vais supporter ça). Le script bash reçoit l'argument qu'il va s'exécuter. L'argument du script est la suivante:Echapper des espaces dans des scripts shell/perl imbriqués

test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45" 

dans le script bash, je lance simplement l'argument qui a été adoptée:

#!/bin/sh 

$1 

Cependant, dans mon script perl l'argument -g n'obtient "Some (c'est avec les citations), au lieu du Some Example. Même si je le cite, il disparaît à cause de l'espace.

J'ai essayé d'échapper à l'espace, mais ça ne marche pas ... des idées?

Répondre

2

Pour le faire fonctionner comme affiché test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45" faire ceci:

#!/bin/bash 
eval "$1" 

Cela provoque l'argument $1 être analysé par la coquille de sorte que les mots individuels seront brisés et les citations retirées.

Ou si vous voulez, vous pouvez supprimer les guillemets et exécuter test.sh myscript.pl -g "Some Example" -n 1 -p 45 si vous avez changé votre script:

#!/bin/bash 
"[email protected]" 

Le "[email protected]" remplacé par tous obtient les arguments $1, $2, etc., tous ceux qui étaient passés dans la ligne de commande.

+0

Il ne passe un seul argument du script, ce qui devrait produire: "test.sh: ligne 2: myscript.pl -g \" Certains Exemple \ » - n 1 -p 45: commande non trouvée ". –

+0

Oui, comme je l'ai dit, le second ne fonctionne que s'il supprime les citations. –

+0

L'eval l'a fait pour moi. Solution ridiculement simple que je pourrais ajouter ... merci. – EDJ

1

La citation est normalement gérée par l'analyseur, qui ne les voit pas lorsque vous remplacez la valeur de $1 dans votre script.

Vous pouvez avoir plus de chance avec:

#!/bin/sh 
eval "$1" 

qui donne:

$ sh test.sh 'perl -le "for (@ARGV) { print; }" "hello world" bye' 
hello world 
bye 

Notez que forçant simplement le shell d'interpréter la citation avec "$1" ne fonctionnera pas, car alors il essaie de traiter le premier argument (c'est-à-dire la commande entière) comme le nom de la commande à exécuter. Vous avez besoin de passer par eval pour obtenir le bon devis, puis ré-analyser la commande.

Cette approche est (évidemment?) Dangereuse et lourde de risques de sécurité.

0

si vous avez vraiment le faire (pour une raison quelconque) pourquoi ne pas simplement:

sh test.sh " 'Exemple Certains' -n 1 -p 45"

dans: test. sh

RUN = myscript.pl
écho `$ RUN 1

(il devrait y avoir des accents graves` avant $ RUN et après 1 $)

1

$ Je vous suggère de nommer le script Perl dans un mot distinct, vous pouvez citer les paramètres lorsque en se référant à eux, et encore facilement extraire le nom du script sans avoir besoin de l'interpréteur de commandes pour diviser les mots, ce qui est le problème fondamental que vous avez.

test.sh myscript.pl "-g \"Some Example\" -n 1 -p 45" 

puis

#!/bin/sh 
$1 "$2" 
Questions connexes