语言: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 的典型行为吗?
编辑:我尝试用 \ 转义 *,还尝试从单引号更改为双引号。我并不希望这样做。