Хотя shlex.quote доступен в Python 3.3 и shlex.join доступен в Python 3.8, они не всегда будут работать как истинный разворот shlex.split
. Обратите внимание на следующий фрагмент:
import shlex
command = "cd /home && bash -c 'echo $HOME'"
print(shlex.split(command))
# ['cd', '/home', '&&', 'bash', '-c', 'echo $HOME']
print(shlex.join(shlex.split(command)))
# cd /home '&&' bash -c 'echo $HOME'
Обратите внимание, что после разделения и последующего объединения токен &&
теперь заключен в одинарные кавычки. Если вы попытаетесь запустить команду сейчас, вы получите сообщение об ошибке: cd: too many arguments
Если вы используете subprocess.list2cmdline()
, как предлагали другие, он лучше работает с такими операторами bash, как &&
:
import subprocess
print(subprocess.list2cmdline(shlex.split(command)))
# cd /home && bash -c "echo $HOME"
Однако теперь вы можете заметить, что кавычки теперь двойные, а не одинарные. Это приводит к тому, что $HOME
расширяется оболочкой, а не печатается дословно, как если бы вы использовали одинарные кавычки.
В заключение, не существует 100% надежного способа отменить shlex.split
, и вам придется выбрать вариант, который наилучшим образом соответствует вашим целям, и остерегаться крайних случаев.
person
Graham Palmer
schedule
29.06.2021