Python:你能说出调用shell的名字吗?

时间:2009-09-29 13:22:00

标签: python shell

我有一个总是从shell调用的python脚本,可以是zsh或bash。

我怎么知道哪一个叫脚本?

3 个答案:

答案 0 :(得分:7)

在Linux中,您可以使用procfs:

>>> os.readlink('/proc/%d/exe' % os.getppid())
'/bin/bash'

os.getppid()返回父进程的PID。这是便携式的。但是获取进程名称不能以便携方式完成。您可以解析所有unices上可用的ps输出,例如与psutil

答案 1 :(得分:0)

您不能以可靠的自动方式执行此操作。

  • 环境变量可能会产生误导(用户可能会恶意切换它们)。大多数自动shell变量都不是“漏洞”,即它们只在shell进程中可见,而不是子进程。

  • 您可以找出您的父PID,然后搜索该ID的进程列表。如果你在后台运行(在这种情况下,PPID始终为1),则不起作用。

  • 用户可以从脚本中启动程序。在这种情况下哪个是正确的shell?脚本启动的那个或脚本的shell?

  • 其他程序可以使用系统调用来运行脚本。在这种情况下,你可以得到他们的shell或者没有。

如果您可以完全控制用户的环境,那么在其配置文件中放置一个变量(查看BASH和ZSH的手册,查看启动时始终读取的文件.IIRC,它是{{ 1}}对于BASH)。

[编辑]创建为两个shell调用的别名。在别名中,使用

.profile

对于zsh,应该评估为“x”,对于bash,应评估为其他内容。

答案 2 :(得分:-2)

os.system(“echo $ 0”)

这在我的系统上完美运行:

cat shell.py: 

    #!/ms/dist/python/PROJ/core/2.5/bin/python

    import os
    print os.system("echo $0")


bash-2.05b$ uname -a
Linux pi929c1n10 2.4.21-32.0.1.EL.msdwhugemem #1 SMP Mon Dec 5 21:32:44 EST 2005 i686 athlon i386 GNU/Linux


pi929c1n10 /ms/user/h/hirscst 8$ ./shell.py
/bin/ksh
pi929c1n10 /ms/user/h/hirscst 9$ bash
bash-2.05b$ ./shell.py
/bin/ksh
bash-2.05b$