Por que o $ SHLVL começa no nível 2 em shells de não-login, mas no nível 1 em shells de login no RHEL 7?

0

Estou usando o "Servidor Red Hat Enterprise Linux versão 7.1 (Maipo)". Quando estou em um shell de não-login, o nível mínimo de shell (echo $ SHLVL) começa no nível mínimo 2 e aumenta com sub-shells sucessivas. Mas quando estou usando um login-shell, o nível mínimo de shell (echo $ SHLVL) começa no nível mínimo de shell 2 e aumenta com sub-shells sucessivas.

[Que.] Por que há uma diferença no nível mínimo de shell entre o shell de login (inicia no nível mínimo do shell 1) e o shell não-login (inicia no nível mínimo do shell 2)?

Estou usando o bash.

    
por mi6agent 12.01.2018 / 07:46

2 respostas

2

Na página do bash man:

SHLVL Incrementado por um cada vez que uma instância de bash é iniciada.

Como você pode ver, essa variável não está relacionada ao fato de ser um shell de login ou não. Significa apenas que o seu bash shell foi iniciado por outro shell bash. Como não sabemos exatamente o que você está fazendo para obter seu shell, não posso dizer por que você tem uma invocação de shell aninhada, mas aqui estão alguns casos comuns:

  • Você está iniciando uma nova janela de terminal a partir da linha de comando

  • Você está usando algum recurso do sistema operacional para iniciar uma nova janela de terminal, e esse recurso é implementado iniciando um bash primeiro que, em seguida, executa o terminal que, por sua vez, executa um novo shell

  • Você tem uma chamada bash recursiva em seu .bash_profile que é executado sempre que SHLVL é igual a 1 (isso soa estranho, mas já vi isso duas vezes!)

por 12.01.2018 / 09:07
1

Quando você efetua login em sua sessão da GUI, o script que configura sua sessão é executado em um shell de login não interativo. Ele lê /etc/profile , seu ~/.[bash_]profile etc. e configura seu ambiente para toda a sessão GUI. Em seguida, o shell executa um script que iniciará seu ambiente de área de trabalho. Efetivamente, esse shell será o SHLVL 1 para sua sessão.

O script de configuração da sessão X pode, na verdade, exec o último comando que realmente aciona o ambiente da área de trabalho. Isso explica porque você não pode encontrar um processo de shell na visualização em árvore do processo para sua sessão ( ps xf ): esse shell acabou e acabou, apenas suas variáveis de ambiente (e quaisquer outras configurações herdáveis, como ulimits personalizados) são herdado pelo processo principal do ambiente de desktop, que os transmite para todos os seus processos filhos. Dessa forma, um programa iniciado a partir de um menu da área de trabalho também terá quaisquer variáveis de ambiente que você tenha configurado em seu .bash_profile, e assim funcionará como esperado.

Também é possível configurar as janelas do terminal para iniciar como shells de login, então elas seriam SHLVL 1. Pelo menos o KDE no Debian parece fazer dessa maneira.

    
por 12.01.2018 / 09:05

Tags