Python sys.argv - получить полную командную строку [с каналом или точкой с запятой] - PullRequest
0 голосов
/ 04 марта 2019

rХотелось бы узнать, можно ли захватить введенную полную командную строку с помощью точки или точки с запятой, как показано ниже:

$> python foo.py arg arg |arg arg

ИЛИ

$> python foo.py arg arg;arg arg

Сегодня в моих попытках sys.argv возвращает только то, что напечатано в левой части строки / точки с запятой, а вторая часть выполняется как независимая команда (что понятно, но нежелаемый :)).

Я попробовал код:

if not '\'' in sys.argv or not '"' in sys.argv:
    print 'foo failed'
    exit

, чтобы заставить команды заключаться в кавычки (и, возможно, заставить систему видеть все как одну командную строку), но сделалне работает, и вторая часть продолжает выполняться после перерыва.

1 Ответ

0 голосов
/ 04 марта 2019

Python не имеет доступа к этим частям.Они не являются частью аргументов команды для Python, а являются входными данными для shell .Каналы, кавычки и точки с запятой являются частью синтаксиса оболочки, а не командной строки для подпроцессов, которые запускает оболочка.

Оболочка разделяет заданный вами синтаксис, а затем вызывает Python только с аргументами, адресованными python двоичныйВы не можете получить целые команды оболочки из подпроцессов, это может быть потенциальной проблемой безопасности.

Если вы хотите передать информацию скрипту Python, вы должны сделать это в аргументах команды.Это означает, что если вы должны включить кавычки в свои аргументы, вы должны сначала экранировать их на уровне оболочки, чтобы они не интерпретировались как синтаксис оболочки, например,

python foo.py arg1 '|' arg2

затем доступен в sys.argv как

['foo.py', 'arg1', '|', 'arg2']

, где одинарные кавычки вокруг | говорят оболочке интерпретировать этот символ как текст аргумента.

Для получения подробных сведений о том, какцитирование работ.Например, если вы используете bash, прочитайте раздел руководства Bash по цитированию .

...