Язык: Python v2.6.2
ОС: AIX 5.3
Я использую Python для восстановления некоторых файлов из резервной копии в тестовую систему - все команды вызываются следующим образом, однако некоторые просто не хотят работать.
#!/usr/bin/python
import subprocess, shlex
cmd = 'sudo rm -rf /work/TEST/*'
arg = shlex.split(cmd)
# This does not work
p = subprocess.Popen(arg)
# This, however, works just fine
p = subprocess.Popen(cmd, shell=True)
Если я удалю * из команд, они будут работать нормально (ну, они работают, как должны, без подстановочных знаков, что, к сожалению, не то, что я хочу).
Я действительно не хочу использовать shell = True по очевидным причинам безопасности, однако есть пара других команд, которые в основном делают то же самое. Если в команде есть подстановочный знак, он просто не сработает - он выполняется без ошибок, просто ничего не делает.
Интересно, что следующая команда (проанализированная с помощью shlex):
sudo mv /work/testrestore/production/* /work/TESTC
Выдает следующее:
mv: 0653-401 Невозможно переименовать / work / testrestore / production / * в / work / TESTC / *: файл или каталог в указанном пути не существует.
Это как если бы unix теперь пытается переместить файл с именем * вместо использования * в качестве подстановочного знака. Это типичное поведение shlex?
Редактировать: Я пытался экранировать * с помощью \, также пытался изменить одинарные кавычки на двойные .. не то, чтобы я ожидал, что это что-то сделает.