os.system()を使用する場合、コマンドにパラメーターとして渡されるファイル名やその他の引数をエスケープする必要があることがよくあります。これどうやってするの?できれば、複数のオペレーティングシステム/シェルで機能するものですが、特にbashの場合に適しています。
私は現在次のことをしていますが、これにはライブラリ関数、または少なくともよりエレガントで堅牢で効率的なオプションが必要です。
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
編集:私は引用符を使用するという単純な答えを受け入れましたが、なぜそれを考えなかったのかわかりません。'と "の動作が少し異なるWindowsから来たのだと思います。
セキュリティに関しては、私は懸念を理解していますが、この場合、os.system()が提供する迅速で簡単な解決策に興味があり、文字列のソースはユーザーが生成したものではないか、少なくとも信頼できるユーザー(私)。
sh_escape
関数は、;
とスペースをエスケープし、のようなファイルを作成するだけでセキュリティの問題を解消しますfoo.txt\;\ rm\ -rf\ /
。