从 bash 或 sh shell 中,我如何确定它是否是使用bash
orsh
命令、登录 shell、xterm 调用的,如果是前者,它是如何调用的?
例如,如果我bash
从 xterm 调用,然后在该实例内再次调用它,它可能会输出类似的内容
me@mylinuxmachine:~$ bash
me@mylinuxmachine:~$ bash
me@mylinuxmachine:~$ magic_command
Called by /bin/bash {
Called by /bin/bash {
Called by xterm
}
}
答案1
您可以pstree
为此使用:
$ bash
bash-4.4$ pstree -p "$$"
-+= 00001 root /sbin/init
\-+= 85460 kk tmux: server (/tmp/tmux-1000/default) (tmux)
\-+= 96572 kk -ksh93 (ksh93)
\-+= 72474 kk bash
\-+= 14184 kk pstree -p 72474
\-+- 51965 kk sh -c ps -kaxwwo user,pid,ppid,pgid,command
\--- 91001 kk ps -kaxwwo user
该pstree
实用程序将显示系统上当前运行的所有进程的父子关系。您可以-p "$$"
将其输出限制为仅包含与当前 shell 相关的进程(其进程 ID 存储在变量中$
)。
要在到达当前 shell 的地方切断输出,您可以使用sed
:
bash-4.4$ pstree -p "$$" | sed "/= $$ /q"
-+= 00001 root /sbin/init
\-+= 85460 kk tmux: server (/tmp/tmux-1000/default) (tmux)
\-+= 96572 kk -ksh93 (ksh93)
\-+= 72474 kk bash
对于 Linux 系统,它显然使用与我正在使用的(在 OpenBSD 上)不同的实用程序实现,您可能想要使用
$ pstree -salup "$$"
得到类似的输出,并且
$ pstree -salup "$$" | sed "/,$$\$/q"
在到达当前 shell 的地方切断输出。
这是一个 shell 函数pls
(对于“process ls
”,这是我能想到的最好的),它对任何给定的 PID(或者当前 shell 的 PID,如果省略)执行上述操作:
function pls
{
local pid="${1:-$$}"
pstree -salup "$pid" | sed "/,$pid\$/q"
}