我有一个总是从shell调用的python脚本,可以是zsh或bash。
我怎么知道哪一个叫脚本?
答案 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$