it-swarm-pt.com

Como saber o "nível" dos shells em que estou?

Se eu abrir um terminal como xterm 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 todos eles? Minha real intenção é sair de tudo, exceto do Shell "root".

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

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

32
phunehehe

Uma maneira (reconhecidamente não perfeita) é adicionar o resultado de ps --no-headers -o comm $PPID ao seu prompt Shell. Isso dirá o nome do processo que gerou 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 lerá "xterm" ou "tela" ou o que quer que seu Shell esteja executando.

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

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

6
sepp2k

De fato, você encontrou o termo correto¹. Existe uma variável de ambiente SHLVL que todos os shells interativos principais (bash, tcsh, zsh) incrementam em 1 quando iniciam. Portanto, se você iniciar um Shell dentro de um Shell, SHLVL aumenta em 1.

Isso não responde diretamente à sua preocupação, entretanto, porque SHLVL carrega coisas como emuladores de terminal. Por exemplo, em 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 apenas se o processo pai do Shell for outro Shell (com heurísticas como “se seu 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 rodando sob outro Shell.

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

¹ Embora ninguém pensasse nisso olhando as páginas de manual: nenhum dos três shells que o suportam incluem a palavra “nível” em sua documentação de SHLVL.

38

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

echo "$SHLVL"
1
Alex

Não é muito elegante, mas você pode usar visualização em árvore em htop para ver a relação 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 chegar ao shell "raiz"

1
Stefan

Eu acho que

$ pstree -u | grep ${USER}

pode ser muito útil para ver onde eu "me encaixo" em um sistema. Eu prefiro isso a pstree -u ${USER}.

Ocasionalmente, ele me lembra que deixei um trabalho Nohup em execução ou semelhante.

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

0
J_H