【发布时间】:2017-10-14 20:55:25
【问题描述】:
我正在使用 Python 的 subprocess 模块来调用一些 Linux 命令行函数。该文档将shell=True 参数解释为
如果shell为
True,则通过shell执行指定的命令
有两个例子,从描述性的角度来看,它们在我看来是一样的(即它们都调用了一些命令行命令),但其中一个使用 shell=True 而另一个没有
>>> subprocess.call(["ls", "-l"])
0
>>> subprocess.call("exit 1", shell=True)
1
我的问题是:
- 与
shell=True相比,使用shell=False运行命令有何作用? - 我的印象是
subprocess.call和check_call和check_output都必须通过shell执行参数。换句话说,它怎么可能不通过shell执行参数?
获取以下示例也会有所帮助:
- 可以用
shell=True做的事情不能用shell=True做shell=False以及为什么不能完成。 - 反之亦然(虽然似乎没有这样的例子)
-
shell=True或False无关紧要的事情以及为什么无关紧要
【问题讨论】:
-
你认为shell如何启动其他(非shell)程序?程序必须有一种方法可以在没有 shell 的情况下启动其他程序,否则 shell 也不能这样做(因为 shell 只是另一个程序)。
-
Shell 不是 UNIX 的基础。当你的系统第一次启动时,它会创建一个进程——PID 1——执行一个外部二进制文件,通常是
/sbin/init。除非init是一个shell 脚本,否则运行它时不涉及shell。init可以在不涉及任何 shell 的情况下同样运行其他程序;为此,它会复制自身(使用fork()),然后将新副本转换为不同的程序(使用execve());在此过程中的任何地方都没有贝壳。即使init运行的是一个shell,它也使用相同的进程。 -
...所以,尊重 shebang 行 -- 无论是
#!/bin/sh或#!/usr/bin/env还是#!/usr/bin/python-- 基本上是由内核完成的事情 作为一部分execve()的执行情况; shell 只是execve()可以调用的另一个程序。 -
您只想要 Linux 的答案吗? Python subprocess.call() 也适用于 Windows。我问是因为这个问题可能是规范的,所以笼统地说是很好的。还可以更好地了解可移植性问题。
-
@smci,让我感到震惊的是,Linux 和 Windows 的答案完全不同,以至于单独的 Windows 问题能够更好地吸引具有特定领域专业知识的人。保持单个问题的范围更窄可以避免您有一个更好地涵盖方面 X 的答案,而另一个更好地涵盖方面 Y 的答案,因此没有/不能拥有一个理想的规范的答案。
标签: python linux bash shell subprocess