2016-10-04 2 views
0

J'utilise OptionParser(), et définir les éléments suivants:Recevoir une commande shell comme argument de chaîne de OptionParser

parser.add_option("--cmd", dest="command", help="command to run") 

Cependant, si je fournis une commande shell complexe, comme:

python shell.py --cmd "for i in `seq 1 10`; do xxx; done" 

et intérieurement imprimer options.command, je reçois quelque chose d'inattendu pour moi:

for i in 1 
2 
3 
4 
5 
6 
7 
8 
9 
10; do 

est-il un bon moyen de passer une option OptionParser qui est une commande shell?

Répondre

1

Lors de l'appel:

python shell.py --cmd "for i in `seq 1 10`; do xxx; done" 

La coquille première substituer la commande ci-joint dans `avec sa sortie. Ainsi, la commande que vous invoquez en fait est:

python shell.py --cmd "for i in 1 
2 
3 
4 
5 
6 
7 
8 
9 
10; do ..." 

Pour éviter cela:

Escape the `caractère lors de l'appel de la commande:

python shell.py --cmd "for i in \`seq 1 10\`; do xxx; done" 

forte utilisation citant (chaîne entre ')

python shell.py --cmd 'for i in `seq 1 10`; do xxx; done' 
+0

Je ne veux pas t o utiliser des échappements dans la commande d'entrée, il y a plus de caractères spéciaux dans la commande étendue que ', est-ce encore possible? – sramij

+0

Il est lié à votre shell plus de python. Essayez d'utiliser 'au lieu de' – napuzba