Ao usar os.system (), muitas vezes é necessário escapar nomes de arquivos e outros argumentos passados como parâmetros para comandos. Como posso fazer isso? De preferência algo que funcionaria em vários sistemas operacionais / shells, mas em particular no bash.
Atualmente, estou fazendo o seguinte, mas tenho certeza de que deve haver uma função de biblioteca para isso, ou pelo menos uma opção mais elegante / robusta / eficiente:
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)))
Edit: Aceitei a resposta simples de usar aspas, não sei por que não pensei nisso; Eu acho que porque eu vim do Windows, onde 'e "se comportam de maneira um pouco diferente.
Em relação à segurança, entendo a preocupação, mas, neste caso, estou interessado em uma solução rápida e fácil fornecida pelo os.system (), e a origem das strings não é gerada pelo usuário ou, pelo menos, inserida por um usuário confiável (eu).
sh_escape
função ideal escaparia dos ;
espaços e e removeria o problema de segurança simplesmente criando um arquivo chamado algo parecido foo.txt\;\ rm\ -rf\ /
.