Determine como o bash ou sh foi chamado

1

De um shell bash ou sh, como posso determinar se ele foi chamado com o comando bash ou sh , um shell de login, um xterm e, no caso do primeiro, como foi chamado?

Por exemplo, se eu chamar bash de um xterm e, em seguida, chamá-lo novamente, dentro dessa instância, ele poderá exibir algo como

me@mylinuxmachine:~$ bash
me@mylinuxmachine:~$ bash
me@mylinuxmachine:~$ magic_command
Called by /bin/bash {
    Called by /bin/bash {
        Called by xterm
    }
}
    
por Theoremiser 22.01.2017 / 13:19

1 resposta

4

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"
}
    
por 22.01.2017 / 13:26