子进程中`shell=True`中的`shell`是指`bash`吗?

问题描述 投票:0回答:3

我想知道在不同的服务器中

subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi",shell=True)
是否会被
sh
zsh
而不是
bash
解释?

有人对此有想法吗?

我应该怎么做才能确保它被

bash
解释?

python shell subprocess
3个回答
37
投票

http://docs.python.org/2/library/subprocess.html

On Unix with shell=True, the shell defaults to /bin/sh

请注意 /bin/sh 通常符号链接到不同的东西,例如在 ubuntu 上:

$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29  2012 /bin/sh -> dash

您可以使用

executable
参数来替换默认值:

...如果 shell=True,则开启 Unix 可执行参数指定一个替换 shell 默认/bin/sh。

subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi",
                shell=True,
                executable="/bin/bash")

4
投票

要指定 shell,使用可执行参数

shell=True
:

如果 shell=True,在 Unix 上可执行参数指定一个 默认 /bin/sh 的替换 shell。

In [26]: subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi", shell=True, executable='/bin/bash')
Out[26]: 0

显然,使用可执行参数更干净,但也可以从 sh 调用 bash:

In [27]: subprocess.call('''bash -c "if [ ! -d '{output}' ]; then mkdir -p {output}; fi"''', shell=True)
Out[27]: 0

3
投票

您可以显式调用您选择的 shell,但对于您发布的示例代码,这不是最好的方法。 相反,直接用 Python 编写代码即可。 请参阅此处:mkdir -p Python 中的功能

© www.soinside.com 2019 - 2024. All rights reserved.