为什么子进程默认使用列表而不是带空格的字符串?

2024-05-07

为什么Python的subprocess模块默认情况下期望参数为列表吗?为什么带空格的字符串(类似于正常运行命令时在终端中输入的内容)不是默认输入?有很多资料解释了如何将命令的空格分隔字符串传递到subprocess,但不太清楚为什么默认值不是相反。


TL;DR 使用列表会绕过 shell,这样您就不必担心 shell 以您不希望的方式解释动态构造的命令行。


假设您有一个非常简单的命令:echo foo。如下,同时使用字符串和列表:

Popen("echo foo", shell=True)
Popen(["echo", "foo"])

还没有太大区别。现在假设参数包含引号来保护空格和/或 shell 模式,echo "foo * bar":

Popen("echo \"foo   *    bar\"", shell=True)
Popen(["echo", "foo   *    bar"])

是的,我可以使用单引号来避免需要转义双引号,但您可以看到列表形式开始具有优势。现在假设我没有该命令的文字参数,但它存储在变量中。Now你想用哪个...

This?

Popen('echo "%s"' % (x,), shell=True)

or this?

Popen(["echo", x])

如果您回答“第一个”,则这是x:

x = "\";rm -rf \""

您刚刚执行的命令是echo ""; rm -rf/""。您需要确保值中存在任何特殊字符x在将其合并到您正在构建并传递给 shell 的字符串之前,首先对其进行转义。

或者您只使用一个列表并完全避免使用 shell。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么子进程默认使用列表而不是带空格的字符串? 的相关文章

随机推荐