Como saber o “nível” de shells em que estou?

30

Se eu abrir um terminal como xterm , eu terei um shell. Então, se eu usar ssh ou zsh , terei outro "nível" de shell. Existe uma maneira de saber quantas vezes eu tenho que Ctrl+D ou digite exit para sair de todas elas? Minha intenção real é sair de tudo, exceto o shell "root".

Também será bom saber que efeito (s) os multiplexadores de terminal (como screen ) têm na solução.

PS: sinta-se à vontade para mudar o título, não sei se esses são os termos corretos.

    
por phunehehe 17.10.2010 / 11:18

5 respostas

6

Uma maneira (reconhecidamente não perfeita) é adicionar o resultado de ps --no-headers -o comm $PPID ao seu prompt de shell. Isto irá dizer-lhe o nome do processo que gerou o seu shell. Se você estiver dentro de um zsh aninhado, ele dirá "zsh". Se você estiver dentro de um zsh de nível superior, ele irá ler "xterm" ou "screen" ou qualquer que seja o seu shell executando.

Para saber se você está dentro de uma sessão ssh ou su, você pode simplesmente ver a parte do nome do host e nome de usuário do seu prompt.

Quando você está executando telas aninhadas (o que não imagino é uma situação comum), não há como pensar se você está no nível mais alto de uma tela aninhada ou no topo nível superior da tela de nível superior. Você poderia configurar a tela para exibir sempre uma linha de status, o que faria com que várias linhas de status fossem exibidas, se você estivesse em telas aninhadas.

    
por 17.10.2010 / 13:23
35

Você chegou a acertar o termo correto¹. Existe uma variável de ambiente SHLVL que todos os principais shells interativos (bash, tcsh, zsh) incrementam em 1 quando iniciam. Então, se você iniciar um shell dentro de um shell, SHLVL aumentará em 1.

Isso não responde diretamente à sua preocupação, porque SHLVL transmite coisas como emuladores de terminal. Por exemplo, na minha configuração típica, $SHLVL é 2 em um xterm, porque o nível 1 corresponde ao shell que executa minha sessão X ( ~/.xinitrc ou ~/.xsession ).

O que eu faço é exibir $SHLVL no meu prompt, mas somente se o processo pai do shell for outro shell (com heurísticas como “se o nome terminar em sh mais pontuação e dígitos opcionais, é um shell ”). Dessa forma, tenho uma indicação visual óbvia no caso incomum de um shell executado sob outro shell.

Talvez você prefira detectar shells em execução diretamente em um emulador de terminal. Você pode fazer isso com bastante precisão: esses são os shells cujo processo pai possui um terminal de controle diferente, de modo que ps -o tty= -p$$ e ps -o tty= -p$PPID produzam resultados diferentes. Você pode redefinir manualmente SHLVL para 1 nesses shells ou definir seu próprio TERMSHLVL para 1 nesses shells (e, caso contrário, será incrementado).

Embora não se pense que ele esteja olhando para as páginas de manual: nenhuma das três shells que o suportam inclui a palavra “level” em sua documentação de SHLVL .

    
por 17.10.2010 / 13:33
1

Não é muito elegante, mas você pode usar exibição de árvore em htop para ver o relacionamento pai-filho de seu shell para outros processos em execução.

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

E use isso para deduzir a quantidade de shells que você precisará para sair, antes de gravar no shell "root"

    
por 17.10.2010 / 13:23
1

Você pode usar a variável de ambiente SHLVL :

echo "$SHLVL"
    
por 10.04.2015 / 11:28
0

Eu acho que

$ pstree -u | grep ${USER}

pode ser bastante útil para ver onde eu me encaixo em um sistema. Eu prefiro mais de pstree -u ${USER} .

Ocasionalmente, ele me lembra que deixei um trabalho nohup em execução ou algo parecido.

(Além disso, eu uso alias grep='grep --color=auto' .)

    
por 24.03.2018 / 23:37