Este infeliz erro foi introduzido no Ubuntu 16.10.
Para contornar o problema, consulte o link
Acabei de atualizar para o Ubuntu 16.10. Por que $SHLVL
agora começa com um valor 2 quando eu abro o terminal Gnome? Este não foi o caso em 16.04.
Se você executar um aplicativo que não inicia um shell, mas pode fornecer acesso às variáveis de ambiente, verá que o ambiente já contém SHLVL
com um valor de 1. Por exemplo, instalei e executei IDLE3, executou import os
e verificou o valor de os.environ['SHLVL']
, que acabou sendo 1.
Agora, SHLVL
também é definido e incrementado em scripts, portanto, se eu executasse um script bash contendo echo $SHLVL
em um terminal, obteria 3.
No entanto, os consoles / TTYs ainda têm SHLVL
de 1, portanto, o culpado deve estar em algum lugar no processo de início da GUI. Eu não sei exatamente o que seria, mas meu palpite é Unity. No GNOME Shell, por exemplo, isso não acontece. Em algum lugar nessa startup do Unity, um script bash provavelmente está presente.
Continuando com o meu comentário na pergunta original (e, isso não é uma resposta em si, já que não posso responder "por que", mas posso verificar se o novo comportamento existe):
Esta alteração quebra a compatibilidade com versões anteriores. Agora, não importa como você abre um terminal / bash no Ubuntu, todos eles começam em SHLVL=2
Embora, eu não tenho certeza se isso é um problema específico do Ubuntu, ou devido ao uso do Unity. Se houver uma lógica que faça algo específico quando o shell pai sair (por exemplo, estado de salvamento), isso nunca será executado.
(Além disso, não tenho certeza se ~/.bash_logout
está sendo chamado ao mesmo tempo de antes. Não tenho certeza, não consigo lembrar. A imprevisibilidade de depender desse comportamento é por que usamos a lógica personalizada dependendo profundidade do shell.A única maneira que eu posso acionar ~/.bash_logout
é explicitamente saindo de um shell iniciado com bash -l
; todos os outros shells do bash do Ubuntu não são shells de login. Poderia sempre ter sido assim.)
Ao experimentar maneiras de tentar deduzir o verdadeiro SHLVL, tentando ver se há outra maneira de dizer um subshell "pai" vs, isso pode funcionar (a verificação do ubuntu é opcional, se isso for de fato um recurso específico bug .
$ echo $SHLVL
2
$ my_shlvl() {
lsb_release -i | grep -qi ubuntu && pstree -s $$ | grep -o bash | wc -l
}
$ export -f my_shlvl
$ my_shlvl
1
$ bash
$ echo $SHLVL
3
$ my_shlvl
2
$ exit
$ my_shlvl
1
Esta solução alternativa é muito específica do gnu / linux (por exemplo, assume pstree
, lsb_release
exists), mas afaik este problema existe apenas em um subconjunto de distribuições linux (até agora, apenas o Ubuntu, mas provavelmente outros, por exemplo, hortelã, etc).
Realmente não, man bash
explica, SHLVL Incremented by one each time an instance of bash is started.
Quando você olha para $SHLVL
no terminal do Gnome, você tem dois níveis de profundidade. Se você olhar para $SHLVL
em um terminal de texto ( Ctrl-Alt-F1 ), ele será iniciado como 1
.
Pode-se acompanhar o progresso de SHLVL
, adicionando essas linhas ao seu .bashrc
:
# keep track of the SHLVL values I see.
export SHLVLs="${SHLVLs:='init'}"
SHLVLs="${SHLVLs}:${SHLVL}"