擅长:python、mysql、java
<p><code>shell=True</code>使用<code>/bin/sh</code>。<code>/bin/sh</code>不是<code>bash</code>。你知道吗</p>
<p>保留shell脚本的所有问题,但使用bash调用它,将如下所示:</p>
<pre><code>cmd = 'time ( s=172.20.16 ; for i in $(seq 1 254) ; do ( ping -n -c 1 -w 1 $s.$i 1>/dev/null 2>&1 && printf "%-16s %s\n" $s.$i responded ) & done ; wait ; echo )'
subprocess.call(['bash', '-c', cmd])
</code></pre>
<hr/>
<p>将其重写为一个更好的shell脚本可能看起来像:</p>
<pre><code>cmd = r'''
time {
s=172.20.16
for ((i=1; i<=254; i++)); do
{ ping -n -c 1 -w 1 "$s.$i" >/dev/null 2>&1 && \
printf "%-16s %s\n" "$s.$i" "responded"
} &
done
wait
echo
}
'''
subprocess.call(['bash', '-c', cmd])
</code></pre>
<p>注意,我们使用的是<code>{ ...; }</code>,而不是<code>( ... )</code>进行分组(这样就避免了更多的子shell创建),而且我们总是引用替换。你知道吗</p>