从python脚本中获取当前shell类型

11

我的脚本设置一些环境变量,以便由Makefile使用。由于每个shell(bash通过export来设置变量,tcsh则是setenv),我需要获取正确的shell类型,从我们运行Python的位置获取。我尝试过使用$SHELL变量,但它总是将sh作为我的shell。

有没有办法从Python脚本中获取正确的shell类型,或者它总是输出"$SHELL"变量作为"SH"?


你为什么需要使用shell?subprocess.*函数有环境变量的参数! - ThiefMaster
2
$SHELL 给出的是登录 shell,而不是当前 shell。为什么不在 Makefile 中指定一个特定的 shell,或者使用 #! 呢? - cdarke
2
我需要这个,因为不同的用户可能有不同的shell偏好,脚本应该检测用户从哪个shell调用它,然后根据此输出正确的数据变量(setenv/export)。 - Viks
3个回答

11

很抱歉又翻出了这个问题,但我刚刚自己解决了它。 以下内容将为您提供当前shell的路径:

from os import environ
print(environ['SHELL'])

你应该能够用任何你正在寻找的环境变量替换shell。


5
无法运行:我的shell已设置为fish,当我在fish中启动bash时,SHELL仍然设置为fish,它从未更改为bash,无论是使用exec bash,还是bash -c "env | grep SHELL"或其他任何我能想到的命令。 - Jens Timmerman
你配置的shell仍然是fish。虽然这种方法使用环境变量,但它无法检测到您进入Bash进程以执行Python,因为这不是它的设计目的。如果您想要一个父进程,我认为您可以通过某种方式使用子进程来实现。但这里的用例是什么?这似乎是一个人为制造的问题。 - DevOops
1
有很多原因让你想知道调用Python脚本的shell是什么,例如当你编写一个Python脚本,输出当前shell的shell命令时。无论配置的shell是什么,当我需要生成针对调用Python的当前shell的输出时,这都不重要。 - Jens Timmerman
一个人可以在.bashrc中设置不同的环境变量、别名等,而在config.fish或.cshrc中则不同。此外,你可以通过启动不同的shell来简单地运行不同的脚本。例如,在使用默认系统shell时,运行python会使用系统python(在我的情况下是2.6),而更改shell后运行python将使用最新的python(3.7),并且可以访问非默认库等。 - Cnoobplusplus

0

如果用户在登录shell之外启动了不同类型的shell,然后在该shell中调用您的Python脚本,您需要查看用于运行脚本父进程的可执行文件:

import os
os.path.realpath(f'/proc/{os.getppid()}/exe')

0

使用以下方式使用shellingham

import shellingham

try:
    shell = shellingham.detect_shell()
except shellingham.ShellDetectionFailure:
    shell = provide_default()

shell 会返回一个包含两个参数的元组,你可以通过 shell[0] 读取你的 shell 名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接