确定 bash 或 sh 是如何调用的

确定 bash 或 sh 是如何调用的

从 bash 或 sh shell 中,我如何确定它是否是使用bashorsh命令、登录 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"
}

相关内容