Se eu abrir um terminal como xterm
eu vou ter uma concha. 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
digitar ou exit
sair 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.
ps: illegal option -- -
, alguma idéia por que? Vou testá-lo novamente no Linux em breve :)--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 dops --no-headers
portably adicionando=
o nome da coluna. Além disso, acomm
coluna não é POSIX, mas acmd
coluna (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.comm
coluna é especificada pelo POSIX e documentada no Mac OS X, enquanto acmd
coluna existe no Linux, mas não é padrão.De fato, você encontrou o termo correto¹. Há uma variável de ambiente
SHLVL
que 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,SHLVL
aumenta em 1.Isso não responde diretamente à sua preocupação, no entanto, porque
SHLVL
carrega 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 faço é exibir
$SHLVL
no meu prompt, mas apenas se o processo pai do shell for outro shell (com heurísticas como "se o nome terminar emsh
mais 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$$
eps -o tty= -p$PPID
produzir uma saída diferente. Você pode redefinir manualmenteSHLVL
para 1 nessas conchas ou definir seu próprioTERMSHLVL
como 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
.fonte
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.ps -o tty= -p$$
eps -o tty= -p$PPID
, porque você disse que eles deveriam produzir resultados diferentes. Ou entendi algo errado?ps -p $$ -p $PPID
(novamente, eu não tenho experiência com OSX, então talvez haja algo incomum acontecendo no OSX).ps -p $$ -p $PPID
dá (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 -bashNã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.
E use isso para deduzir a quantidade de conchas que você precisará sair antes de chegar ao shell "raiz"
fonte
Você pode usar a variável de ambiente SHLVL :
fonte
ssh
por exemplo, para a mesma conta este ainda será1
eu acho que
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
nohup
trabalho em execução, ou similar.(Além disso, eu uso
alias grep='grep --color=auto'
.)fonte