Khi sử dụng os.system (), bạn thường phải thoát khỏi tên tệp và các đối số khác được truyền dưới dạng tham số cho lệnh. Tôi có thể làm cái này như thế nào? Tốt hơn là một cái gì đó sẽ hoạt động trên nhiều hệ điều hành / shell nhưng đặc biệt cho bash.
Tôi hiện đang làm những việc sau, nhưng chắc chắn rằng phải có một hàm thư viện cho việc này, hoặc ít nhất là một tùy chọn thanh lịch / mạnh mẽ / hiệu quả hơn:
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)))
Chỉnh sửa: Tôi đã chấp nhận câu trả lời đơn giản là sử dụng dấu ngoặc kép, không biết tại sao tôi không nghĩ đến điều đó; Tôi đoán vì tôi đến từ Windows ở đâu 'và' cư xử hơi khác một chút.
Về bảo mật, tôi hiểu mối quan tâm này, nhưng trong trường hợp này, tôi quan tâm đến một giải pháp nhanh chóng và dễ dàng mà os.system () cung cấp và nguồn của các chuỗi không phải do người dùng tạo hoặc ít nhất là được nhập bởi người dùng đáng tin cậy (tôi).
sh_escape
hàm lý tưởng sẽ thoát ra khỏi các ;
dấu cách và và loại bỏ vấn đề bảo mật bằng cách chỉ cần tạo một tệp có tên giống như vậy foo.txt\;\ rm\ -rf\ /
.