Получение команды оболочки в качестве строкового аргумента OptionParser

#python #shell #optionparser

#python #оболочка #optionparser

Вопрос:

Я использую OptionParser() и определяю следующее:

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

Однако, если я предоставлю сложную команду оболочки, такую как :

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

И внутренняя печать options.command , я получаю что-то неожиданное для меня:

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

Есть ли хороший способ передать параметр OptionParser, который является командой оболочки?

Ответ №1:

При вызове:

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

Оболочка сначала заменяет команду, заключенную в `, своим выводом. Таким образом, команда, которую вы фактически вызываете, является:

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

Чтобы избежать этого:

Экранируйте символ ` при вызове команды:

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

Используйте сильные кавычки (строка, заключенная в ‘)

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

Комментарии:

1. Я не хочу использовать экранирование в команде ввода, в расширенной команде больше специальных символов, чем `, это все еще возможно?

2. Это связано с вашей оболочкой больше, чем с python. Попробуйте использовать » вместо »