A variável $ SHLVL é usada para informar quantos shells você tem. Se você está confuso com isso vale a pena começar no início.
O que é um shell?
Um shell recebe comandos e os fornece ao sistema operacional subjacente para executar. Na maioria dos sistemas Linux, o programa shell é chamado de BASH (The Bourne Again Shell), mas há outros disponíveis, incluindo o C Shell (tcsh) e o shell KORN (ksh).
Como acessar o shell do Linux
Geralmente, como usuário, você interage com o programa shell através do uso de um programa de emulação de terminal, como o XTerm, o konsole ou o gnome-terminal.
Se você estiver executando um gerenciador de janelas, como o Openbox ou um ambiente de área de trabalho, como o GNOME ou o KDE, você encontrará um emulador de terminal a partir de um menu ou de um hífen. Em muitos sistemas, o atalho CTRL ALT e T também abrirão uma janela de terminal.
Alternativamente, você pode alternar para outro TTY (teletypewriter) que fornece acesso direto a um shell de linha de comando. Você pode fazer isso pressionando CTRL ALT e F1 ou CTRL ALT e F2, etc.
O que é um nível de casca?
Quando você executa um comando em um shell, ele é executado em algo chamado nível do shell. Dentro de um shell, você pode abrir outro shell que o torna um subshell ou o shell que o abriu.
Portanto, o shell pai seria considerado, talvez, o shell de nível 1 e o shell filho seria um shell de nível 2.
Como exibir o nível do shell
Não deve ser surpresa, com base no título do artigo, que a maneira como você pode dizer em qual nível de shell está sendo executado, usando a variável $ SHLVL.
Para ver o nível do shell que você está executando atualmente, digite o seguinte:
echo $ SHLVL
De forma bastante interessante, se você executar o comando acima em uma janela de terminal, ficará surpreso ao ver que o resultado retornado é 2.
Se, no entanto, você executar o mesmo comando usando o tty, o resultado será 1.
Por que esse é o caso que você pode perguntar? Bem, o ambiente de desktop que você está executando está sendo executado em cima de um shell. Esse shell seria o nível 1. Qualquer janela de terminal aberta no ambiente de área de trabalho deve ser filha do shell que abriu o ambiente de área de trabalho e, portanto, o nível do shell não pode ser iniciado em qualquer número diferente de 2.
O tty não está executando um ambiente de desktop e, portanto, é simplesmente um shell de nível 1.
Como criar subnails
A maneira mais fácil de testar o conceito de shells e subshells é a seguinte. Abra uma janela de terminal e digite o seguinte:
echo $ SHLVL
Como sabemos a partir de uma janela de terminal, o nível mínimo de shell é 2.
Agora, dentro da janela do terminal, digite o seguinte:
sh
O comando sh por si só executa um shell interativo, o que significa que você está usando um shell dentro de um shell ou de um subshell.
Se você agora digitar novamente:
echo $ SHLVL
Você verá que o nível do shell está definido como 3. A execução do comando sh a partir do subshell abrirá uma subcamada da subshell e, portanto, o nível do shell estará no nível 4.
Por que o nível da casca é importante?
O nível do shell é importante quando se pensa no escopo das variáveis nos seus scripts.
Vamos começar com algo simples:
dog = maisieecho $ dog Se você executar o comando acima em um shell, a palavra maisie será exibida na janela do terminal. Abra um novo shell digitando o seguinte: sh Se você executar este comando, verá que nada é realmente retornado: echo $ dog Isso porque a variável $ dog está disponível apenas no nível de shell 2. Se você digitar exit para sair da subshell e executar echo $ dog novamente, a palavra maisie será exibida novamente. Também vale a pena pensar sobre o comportamento de variáveis globais dentro de um shell. Comece em uma nova janela de terminal e digite o seguinte: cão de exportação = maisieecho $ dog Como você esperaria que a palavra maisie seja exibida. Agora abra um subshell e digite echo $ dog novamente. Desta vez, você verá que a palavra maisie é exibida mesmo que você esteja em uma subcamada. A razão para isso é que o comando de exportação tornou a variável $ dog global. Alterar a variável $ dog dentro do subshell, mesmo se você usar o comando de exportação, não afeta os shells-pai. Espero que com isso você possa ver que saber o nível de shell em que você está trabalhando tem algum significado ao escrever scripts. Os exemplos que eu dei são muito simplistas, mas é bastante comum que um script de shell chame outro script de shell que, por sua vez, chama outro script de shell, todos eles rodando em diferentes níveis. Conhecer o nível da casca pode ser muito importante.