Por que o SHLVL é inicialmente 2 no Ubuntu 16.10 (mas não em versões anteriores)?

2

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.

    
por user643722 03.12.2016 / 14:37

4 respostas

2

Este infeliz erro foi introduzido no Ubuntu 16.10.

Para contornar o problema, consulte o link

    
por jimav 01.08.2017 / 19:55
1

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.

    
por muru 04.12.2016 / 08:39
1

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).

    
por michael 11.07.2017 / 10:07
0

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}"
    
por waltinator 03.12.2016 / 16:21