擅长:python、mysql、java
<p>正如在<a href="https://docs.python.org/2/library/subprocess.html?highlight=popen#subprocess.Popen" rel="nofollow noreferrer">^{<cd1>} documentation</a>(<code>subprocess.call</code>委托给<code>Popen</code>中所解释的,与所有其他方便函数一样,<code>subprocess.call('command', shell=True)</code>在Unix中等同于运行<em>argv</em>:</p>
<pre><code>['/bin/sh', '-c', 'command']
</code></pre>
<p>而且<code>sh</code>不支持大括号扩展(这是<code>{a,b}</code>语法的正式名称)。你知道吗</p>
<p>要使用<code>bash</code>运行命令,需要重写与<code>executable</code>参数一起使用的shell可执行文件:</p>
<pre><code>p = subprocess.call('command', shell=True, executable='/bin/bash')
</code></pre>
<p>示例:</p>
<pre><code>$ python -c 'import subprocess; subprocess.call("echo /usr/{lib,bin}", shell=True, executable="/bin/bash")'
/usr/lib /usr/bin
</code></pre>
<hr/>
<p>但是请注意,不鼓励使用<code>shell=True</code>,因为它本身是特定于平台的,依赖于本地shell及其设置,如果使用不受信任的输入,则可能是一个bug或安全漏洞。最好手动构造命令行并传递结果<em>argv。</em></p>