Você pode usar pstree
para isso:
$ 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
O utilitário pstree
mostrará os relacionamentos pai-filho para todos os processos atualmente em execução no sistema. Com -p "$$"
, você restringe sua saída para conter apenas processos relacionados ao shell atual (cujo ID do processo é armazenado na variável $
).
Para cortar a saída no ponto em que ela chega ao shell atual, você pode usar 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
Para sistemas Linux, que aparentemente usam uma implementação diferente deste utilitário do que eu estou usando (no OpenBSD), você pode querer usar
$ pstree -salup "$$"
para obter um resultado semelhante e
$ pstree -salup "$$" | sed "/,$$\$/q"
para cortar a saída no ponto em que ela chega ao shell atual.
Aqui está uma função do shell pls
(para "process ls
", é o melhor que eu consegui fazer) que faz o acima para qualquer PID (ou o PID do shell atual se deixado de fora):
function pls
{
local pid="${1:-$$}"
pstree -salup "$pid" | sed "/,$pid\$/q"
}