Como e por que usaría a variable $ SHLVL

A variable $ SHLVL emprégase para dicir cantas cunchas son profundas. Se estás confundido con isto vale a pena comezar ao principio.

¿Que é unha cuncha?

Un shell toma comandos e dálles ao sistema operativo subxacente para realizar. Na maioría dos sistemas Linux o programa shell é chamado BASH (The Bourne Again Shell) pero hai outros dispoñibles, incluíndo o Shell C (tcsh) eo shell shell (ksh).

Como acceder ao shell de Linux

Xeralmente como usuario, interactúa co programa shell mediante o uso dun programa de emulación de terminal como XTerm, konsole ou gnome-terminal.

Se está a executar un xestor de fiestras como Openbox ou un ambiente de escritorio como GNOME ou KDE, atopará un emulador de terminal desde un menú ou un guión. En moitos sistemas, o atallo CTRL ALT e T abrirá tamén unha fiestra de terminal.

Alternativamente pode cambiar a outro tty (teletypewriter) que fornece o acceso directo a un shell de liña de ordes. Podes facelo premendo CTRL ALT e F1 ou CTRL ALT e F2 etc.

Que é un nivel de cuncha?

Cando executas un comando nun intérprete de comandos execútase en algo chamado o nivel de intérprete. Dentro dun intérprete de comandos pode abrir outro shell que o converte nun subconxelado ou o shell que o abriu.

Por conseguinte, o shell primario sería considerado talvez o shell de nivel 1 eo shell do neno sería un shell de nivel 2.

Como amosar o nivel de Shell

Non debe ser unha sorpresa en función do título do artigo que a forma na que pode dicir que nivel de shell está executando é mediante a variable $ SHLVL.

Para ver o nivel de intérprete de comandos que está a executar actualmente, escriba o seguinte:

echo $ SHLVL

En vez de interesante, se executas o comando anterior dentro dunha xanela de terminal, podes sorprenderche ver que o resultado devolto é 2.

Se con todo executa o mesmo comando usando o tty, o resultado é 1.

Por que este é o caso? Ben, o ambiente de escritorio que está a executar está a ser executado enriba dun shell. Que o intérprete de ordes sería o nivel 1. Calquera fiestra de terminal que abra desde dentro dese ambiente de escritorio ten que ser un fillo do intérprete de comandos que abriu o ambiente de escritorio e, polo tanto, o nivel de intérprete de comandos non pode comezar en ningún outro número que non sexa 2.

O tty non está a executar un ambiente de escritorio e, polo tanto, é simplemente un shell de nivel 1.

Como crear sublletinas

A forma máis sinxela de probar o concepto de cunchas e subconxuntos é a seguinte. Abra unha xanela de terminal e escriba o seguinte:

echo $ SHLVL

Como sabemos desde unha xanela de terminal o nivel mínimo de concha é de 2.

Agora, dentro da xanela do terminal escriba o seguinte:

sh

O comando sh executa un shell interactivo que significa que está a usar un intérprete nunha cuncha ou un subconxunto.

Se agora escribe isto de novo:

echo $ SHLVL

Verá que o nivel de intérprete está establecido en 3. Correndo o comando sh dentro do subshell abrirá un subconxunto do subshell e así o nivel de intérprete estará no nivel 4.

Por que é importante o nivel do bloque?

O nivel de contorno é importante cando se pensa no alcance das variables dentro dos seus guións.

Empecemos por algo sinxelo:

can = maisie
eco $ can

Se executar o comando anterior nun shell, a palabra maisie mostrarase na xanela do terminal.

Abra un novo intérprete de comandos escribindo o seguinte:

sh

Se executas este comando verás que nada se devolve realmente:

eco $ can

Isto ocorre porque a variable de $ can só está dispoñible no nivel 2 do shell. Se escribe exit para saír do subshell e execute echo $ dog nuevamente a palabra maisie volverá a mostrarse.

Tamén vale a pena pensar no comportamento das variables globais dentro dunha cuncha.

Comezar nunha nova fiestra de terminal e escriba o seguinte:

export dog = maisie
eco $ can

Como se podería esperar, aparece a palabra maisie. Agora abre un subshell e escribe eco $ dog de novo. Esta vez verás que a palabra maisie aparece aínda que estás nun subshell.

A razón para isto é que o comando de exportación converteu a variable de $ can global. Cambiar a variable de $ can dentro do subshell mesmo se usa o comando de exportación non ten ningún efecto sobre os seus contas primarios.

Con sorte, podes ver que sabendo que o nivel de capa que estás a traballar ten algún significado ao escribir scripts.

Os exemplos que outorgaron son moi simples pero é moi común que un script de shell para chamar a outro script de shell que á súa vez chame a outro script de shell todos eles agora en varios niveis. Coñecer o nivel de cuncha pode ser moi importante.