Saat menggunakan os.system (), sering kali perlu untuk keluar dari nama file dan argumen lain yang diteruskan sebagai parameter ke perintah. Bagaimana saya bisa melakukan ini? Lebih disukai sesuatu yang akan bekerja pada beberapa sistem operasi / shell tetapi khususnya untuk bash.
Saat ini saya melakukan hal berikut, tetapi saya yakin harus ada fungsi pustaka untuk ini, atau setidaknya opsi yang lebih elegan / kuat / efisien:
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)))
Sunting: Saya telah menerima jawaban sederhana menggunakan tanda kutip, tidak tahu mengapa saya tidak memikirkannya; Saya kira karena saya berasal dari Windows di mana 'dan "berperilaku sedikit berbeda.
Mengenai keamanan, saya memahami kekhawatirannya, tetapi, dalam kasus ini, saya tertarik dengan solusi cepat dan mudah yang disediakan os.system (), dan sumber string bukan buatan pengguna atau setidaknya dimasukkan oleh pengguna tepercaya (saya).
sh_escape
Fungsi yang ideal akan keluar dari ;
spasi dan dan menghilangkan masalah keamanan hanya dengan membuat file bernama seperti foo.txt\;\ rm\ -rf\ /
.