Com i per què usaria la variable $ SHLVL

La variable $ SHLVL s'utilitza per explicar-vos quantes closques es troben en profunditat. Si estàs confós, val la pena començar des del principi.

Què és una petxina?

Un shell pren comandes i els dóna al sistema operatiu subjacent per realitzar. En la majoria de sistemes Linux, el programa shell es diu BASH (The Bourne Again Shell), però hi ha altres disponibles incloent C Shell (tcsh) i shell shell (KSH).

Com accedir al Shell de Linux

En general, com a usuari, interactua amb el programa shell mitjançant l'ús d'un programa d' emulació de terminal com XTerm, konsole o gnome-terminal.

Si esteu executant un gestor de finestres com Openbox o un entorn d'escriptori com GNOME o KDE, trobareu un emulador de terminal des d'un menú o un tauler. En molts sistemes, la drecera CTRL ALT i T obrirà també una finestra de terminal.

Alternativament, podeu canviar a un altre tty (teletypewriter) que proporciona accés directe a un intèrpret d'ordres de línia. Podeu fer-ho prement CTRL ALT i F1 o CTRL ALT i F2, etc.

Què és un nivell de cargol?

Quan executeu una ordre en un intèrpret d'ordres, s'executa en un element anomenat el nivell de l'intèrpret d'ordres. Dins d'un intèrpret d'ordres podeu obrir un altre intèrpret d'ordres que el converteix en un subconjunt o el intèrpret d'ordres que el va obrir.

Per tant, la shell primària es consideraria potser el shell del nivell 1 i el shell del nen seria un intèrpret de nivell 2.

Com mostrar el nivell de Shell

No ha de ser una sorpresa basada en el títol de l'article que la forma en què es pot dir quin nivell de shell està executant és mitjançant la variable $ SHLVL.

Per veure el nivell de shell que s'està executant actualment, escriviu el següent:

echo $ SHLVL

Més que interessant si executeu l'ordre anterior dins d'una finestra de terminal, podeu sorprendre veure que el resultat retornat és 2.

Si, tanmateix, executeu el mateix ordre utilitzant el tty, el resultat és 1.

Per què és aquest el cas? Bé, l'entorn d'escriptori que s'està executant s'està executant a sobre d'un intèrpret d'ordres. Aquesta casella seria el nivell 1. Qualsevol finestra de terminal que obriu des d'aquest entorn d'escriptori ha de ser un nen de la shell que va obrir l'entorn d'escriptori i, per tant, el nivell de shell no pot iniciar-se en cap número més que 2.

El tty no executa un entorn d'escriptori i, per tant, és simplement un intèrpret de nivell 1.

Com crear subscripcions

La forma més senzilla de provar el concepte de closca i subsòl és la següent. Obriu una finestra de terminal i escriviu el següent:

echo $ SHLVL

Com sabem des d'una finestra de terminal, el nivell mínim de shell és 2.

Ara, dins de la finestra del terminal, escriviu el següent:

sh

La comanda sh executa un shell interactiu que significa que esteu utilitzant un intèrpret d'ordres dins d'un intèrpret d'ordres o un subshell.

Si ara escriu això de nou:

echo $ SHLVL

Veureu que el nivell de l'intèrpret d'ordres s'estableix a 3. Executant l'ordre sh des del subshell s'obrirà un subshell del subshell i, per tant, el nivell de l'intèrpret d'ordres estarà al nivell 4.

Per què és important el nivell del tauler?

El nivell de la closca és important quan es pensa en l'abast de les variables dins dels vostres scripts.

Comencem amb alguna cosa senzill:

gos = majordom
eco $ gos

Si executeu l'ordre anterior en un intèrpret d'ordres, la paraula maisie es mostrarà a la finestra del terminal.

Obriu un shell nou escrivint el següent:

sh

Si executeu aquesta ordre, veureu que res no es torna:

eco $ gos

Això és degut a que la variable $ de gos només està disponible al nivell 2 de la captura. Si escriviu exit per sortir del subshell i executeu echo $ dog, la paraula maisie tornarà a mostrar-se.

També val la pena pensar en el comportament de variables globals dins d'un intèrpret d'ordres.

Comença en una nova finestra de terminal i escriviu el següent:

export dog = maisie
eco $ gos

Com es podria esperar, es mostra la paraula maisie. Ara obriu un subshell i escriviu eco $ dog una altra vegada. Aquesta vegada, veureu que la paraula maisie es mostra encara que estigui en un subshell.

El motiu d'això és que l'ordre d'exportació va fer que la variable de $ gos global. Si canvieu la variable de $ can dins del subshell, fins i tot si utilitzeu l'ordre d'exportació, no afecta els seus intèrprets primaris.

Amb sort, podeu veure que saber que el nivell de l'intèrpret està treballant té alguna importància en escriure scripts.

Els exemples que he donat són molt simplistes, però és bastant comú que un script de shell digui a un altre script de shell que, al seu torn, truca a un altre script shell que s'està executant en diferents nivells. Conèixer el nivell de la closca pot ser molt important.