5

言語: 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 が * をワイルドカードとして使用するのではなく、* という名前のファイルを移動しようとしているかのようです。これはシュレックスの典型的な行動ですか?

編集: * を \ でエスケープしようとしましたが、一重引用符から二重引用符に変更しようとしました..それが何かをするとは思っていませんでした。

4

1 に答える 1