Bash
確定如何呼叫 bash 或 sh
從 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 } }
您可以
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" }