os.system()执行命令下哪个linux shell?

时间:2009-05-25 03:30:15

标签: python linux shell

我使用/ bin / tcsh作为我的默认shell。

但是,tcsh样式命令os.system('setenv VAR val')对我不起作用。但是os.system('export VAR = val')可以工作。

所以我的问题是如何知道os.system()运行命令在哪个shell下?

4 个答案:

答案 0 :(得分:10)

只是阅读Executing BASH from Python,然后是17.1. subprocess — Subprocess management — Python v2.7.3 documentation,我看到executable参数;它似乎有效:

$ python
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:16:52) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print os.popen("echo $0").read()
sh
>>> import subprocess
>>> print subprocess.call("echo $0", shell=True).read()
/bin/sh
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True).stdout.read()
/bin/sh
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read()
/bin/bash
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True).stdout.read()
/bin/sh: Syntax error: "(" unexpected
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read()
TEST

希望这有助于某人,
干杯!

答案 1 :(得分:9)

这些天你应该使用Subprocess模块而不是os.system()。根据那里的文档,默认shell是/bin/sh。我相信os.system()的工作原理相同。

编辑:我还应该提到子进程模块允许您通过env参数设置执行进程可用的环境。

答案 2 :(得分:5)

os.system()只需调用system()系统调用(“man 3 system”)。在大多数* nixes上,这意味着你得到/bin/sh

请注意,export VAR=val在技术上并非标准语法(尽管bash了解它,我认为ksh也是如此)。它不适用于/bin/sh实际上是Bourne shell的系统。在这些系统上,您需要导出并设置为单独的命令。 (这也适用于bash。)

答案 3 :(得分:2)

如果您的命令是一个shell文件,并且该文件是可执行文件,并且该文件以“#!”开头,则可以选择您的shell。

#!/bin/zsh
Do Some Stuff

您可以编写此文件,然后使用subprocess.Popen(filename,shell=True)执行该文件,您就可以使用任何所需的shell。

另外,请务必阅读关于os.systemsubprocess.Popen的{​​{3}}。