Bash

確定如何呼叫 bash 或 sh

  • January 22, 2017

從 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
   }
}

您可以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 函式pls(對於“程序ls”,這是我能想到的最好的方法),它對任何給定的 PID(或目前 shell 的 PID,如果省略)執行上述操作:

function pls
{
 local pid="${1:-$$}"
 pstree -salup "$pid" | sed "/,$pid\$/q"
}

引用自:https://unix.stackexchange.com/questions/339299