Сообщить об ошибке.

Разбор команд bash, dash и sh модулем shlex в Python

Анализатор команд для терминальных оболочек bash, dash и sh

Класс shlex обеспечивает совместимость с анализом, выполняемым обычными терминальными оболочками Unix, такими как bash, dash и sh.

Чтобы воспользоваться этой совместимостью, укажите аргумент punctuation_chars в конструкторе. По умолчанию используется значение False, которое сохраняет поведение до Python-3.6. Если аргумент punctuation_chars установлен в True, то анализ символов (); | & меняется: любое появление этих символов возвращается как один токен.

Хотя это не специфичный анализатор команд для оболочек bash, dash и sh, он позволяет выполнять обработку командных строк очень легко.

>>> import shlex
 >>> cmd = "a && b; c && d || e; f >'abc'; (def \"ghi\")"
 >>> sh = shlex.shlex(cmd, posix=True)
 >>> sh.whitespace_split = True
 >>> list(s)
 # ['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)']
 >>> sh = shlex.shlex(cmd, posix=True, punctuation_chars=True)
 >>> sh.whitespace_split = True
 >>> list(sh)
 # ['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';',
 # '(', 'def', 'ghi', ')']

Конечно, будут возвращены токены, которые недопустимы для оболочек, и вам нужно будет выполнить собственные проверки ошибок на возвращенных токенах.

Вместо передачи True в качестве значения параметра punctuation_chars, можно передать строку с конкретными символами, которая будет использоваться для определения того, какие символы представляют собой знаки препинания.

>>> import shlex
>>> s = shlex.shlex("a && b || c", punctuation_chars="|")
>>> list(s)
# ['a', '&', '&', 'b', '||', 'c']

Примечание. Если указано значение аргумента punctuation_chars, атрибут sh.wordchars дополняется символами ~-./*?=. Это связано с тем, что эти символы могут появляться в именах файлов, включая символы подстановки и аргументах командной строки, например --color=auto).

Следовательно:

>>> import shlex
>>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?',
...                 punctuation_chars=True)
>>> list(s)
# ['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?']

Тем не менее, чтобы максимально приблизиться к анализу, который проводит терминальная оболочка, рекомендуется всегда использовать режим POSIX и sh.whitespace_split при использовании аргумента punctuation_chars, что полностью отрицает sh.wordchars.

Для лучшего эффекта, punctuation_chars должны быть установлены вместе с posix=True. Обратите внимание, что до Python-3.6 аргумент posix=False в модуле shlex является значением по умолчанию.

.