Como saber o "nível" de conchas em que estou?

32

Se eu abrir um terminal como xtermeu vou ter uma concha. Então, se eu usar sshou zshterei outro "nível" de shell. Existe uma maneira de saber quantas vezes eu tenho que Ctrl+Ddigitar ou exitsair de todas elas? Minha verdadeira intenção é sair de tudo, exceto o shell "raiz".

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

PS: Por favor, sinta-se livre para alterar o título, não sei se esses são os termos corretos.

phunehehe
fonte

Respostas:

6

Uma maneira (reconhecidamente não perfeita) é adicionar o resultado ps --no-headers -o comm $PPIDao seu prompt de shell. Isso informará 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 "screen" ou o que o shell estiver executando.

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

Quando você está executando telas aninhadas (o que eu acho que não é uma situação comum), não há como pensar 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ê pode configurar a tela para exibir sempre uma linha de status, o que faria com que várias linhas de status fossem exibidas, se você estiver em telas aninhadas.

sepp2k
fonte
Aaah ... snap .. me derrote. :) +1
Stefan
Atualmente eu estou em um mac e o comando me deu ps: illegal option -- -, alguma idéia por que? Vou testá-lo novamente no Linux em breve :)
phunehehe
3
@phunehehe: --option-nameé principalmente um recurso específico do GNU, então não está disponível em utilitários de sistema padrão fora do Linux. Mas você pode obter o efeito do ps --no-headersportably adicionando =o nome da coluna. Além disso, a commcoluna não é POSIX, mas a cmdcoluna (que inclui os argumentos do comando) é. Também -pé necessário antes do PID na sintaxe POSIX. Portanto, ps -o cmd= -p $PPIDé portátil e fornece informações semelhantes.
Gilles 'SO- stop be evil'
confirmado, funciona no Gentoo
phunehehe 17/10/10
2
@phunehehe: desculpe, eu cometi um erro no comentário acima. De fato, a commcoluna é especificada pelo POSIX e documentada no Mac OS X, enquanto a cmdcoluna existe no Linux, mas não é padrão.
Gilles 'SO- stop be evil'
37

De fato, você encontrou o termo correto¹. Há uma variável de ambiente SHLVLque todas as principais shells interativas (bash, tcsh, zsh) incrementam em 1 quando são iniciadas. Portanto, se você iniciar um shell dentro de um shell, SHLVLaumenta em 1.

Isso não responde diretamente à sua preocupação, no entanto, porque SHLVLcarrega 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 ( ~/.xinitrcou ~/.xsession).

O que faço é exibir $SHLVLno meu prompt, mas apenas se o processo pai do shell for outro shell (com heurísticas como "se o nome terminar em shmais pontuação e dígitos opcionais, é um shell"). Dessa forma, tenho uma indicação visual óbvia no caso incomum de um shell executando sob outro shell.

Talvez você prefira detectar shells que estão sendo executados diretamente sob um emulador de terminal. Você pode fazer isso com bastante precisão: estas são as conchas cujo processo pai tem um terminal de controle diferente, de modo que ps -o tty= -p$$e ps -o tty= -p$PPIDproduzir uma saída diferente. Você pode redefinir manualmente SHLVLpara 1 nessas conchas ou definir seu próprio TERMSHLVLcomo 1 nessas conchas (e incrementado de outra forma).

¹ Embora ninguém ache que está olhando as páginas do manual: nenhum dos três shells que o suportam inclui a palavra “level” em sua documentação SHLVL.

Gilles 'SO- parar de ser mau'
fonte
Obrigado por confirmar o termo. Eu ainda estou em um mac e surpreso ao encontrar esses 2 comandos que dão o mesmo resultado, independentemente do meu nível de shell.
phunehehe
@phunehehe: quais 2 comandos? Se você quer dizer ps -o tty= -p$pid, isso mostra o terminal de controle do processo, que identifica o emulador de terminal (xterm, screen, sshd,…) no qual o processo está sendo executado. Ele não será alterado se você iniciar um shell a partir de outro, mas será alterado se você inicie um novo emulador de terminal. Se o emulador de terminal for um aplicativo nativo do Mac, pode haver uma sutileza específica do Mac que eu desconheço.
Gilles 'SO- stop be evil'
ps -o tty= -p$$ e ps -o tty= -p$PPID , porque você disse que eles deveriam produzir resultados diferentes. Ou entendi algo errado?
phunehehe
@phunehehe: Eles fornecem uma saída diferente quando o processo pai do shell é um emulador de terminal, porque o emulador de terminal não tem seu terminal emulado como um terminal de controle. Se você achar o contrário, poste a saída de ps -p $$ -p $PPID(novamente, eu não tenho experiência com OSX, então talvez haja algo incomum acontecendo no OSX).
Gilles 'SO- stop be evil'
@ Gilles: isso era realmente algo incomum com o OSX. Eu testei no Gentoo e tudo estava correto como você disse. No OSX, ps -p $$ -p $PPIDdá (desculpe, eu não sei como formatar comentários) PID TTY TEMPO CMD 209 ttys000 0: 00.01 de login -pf phunehehe 210 ttys000 0: 00,12 -bash
phunehehe
1

Não é muito elegante, mas você pode usar a visualização em árvore no htop para ver o relacionamento pai-filho do seu shell com 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 conchas que você precisará sair antes de chegar ao shell "raiz"

Stefan
fonte
1

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

echo "$SHLVL"
Alex
fonte
1
Se você usar sshpor exemplo, para a mesma conta este ainda será1
Anthon
0

eu acho que

$ pstree -u | grep ${USER}

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

Ocasionalmente, isso me lembrará que eu deixei um nohuptrabalho em execução, ou similar.

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

J_H
fonte