言語: Python v2.6.2
OS: 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 が * をワイルドカードとして使用するのではなく、* という名前のファイルを移動しようとしているかのようです。これはシュレックスの典型的な行動ですか?
編集: * を \ でエスケープしようとしましたが、一重引用符から二重引用符に変更しようとしました..それが何かをするとは思っていませんでした。