La variable $ SHLVL se usa para decirle cuánta profundidad de conchas tiene usted. Si estás confundido por esto, vale la pena comenzar desde el principio.
¿Qué es una concha?
Un shell toma los comandos y los entrega al sistema operativo subyacente para que los ejecute. En la mayoría de los sistemas Linux, el programa de shell se llama BASH (The Bourne Again Shell) pero hay otros disponibles, incluyendo el Shell C (tcsh) y el shell KORN (ksh).
Cómo acceder al shell de Linux
Generalmente, como usuario, usted interactúa con el programa shell a través del uso de un programa de emulación de terminal como XTerm, konsole o gnome-terminal.
Si está ejecutando un administrador de Windows como Openbox o un entorno de escritorio como GNOME o KDE, encontrará un emulador de terminal desde un menú o un guión. En muchos sistemas, el acceso directo CTRL ALT y T también abrirá una ventana de terminal.
Alternativamente, puede cambiar a otro TTY (teletypewriter) que proporciona acceso directo a un shell de línea de comandos. Puede hacerlo presionando CTRL ALT y F1 o CTRL ALT y F2, etc.
¿Qué es un nivel de shell
Cuando ejecuta un comando en un shell, se ejecuta en algo que se llama el nivel de shell. Dentro de un shell, puede abrir otro shell que lo convierte en un subshell o el shell que lo abrió.
Por lo tanto, el shell primario se consideraría tal vez el shell de nivel 1 y el shell secundario sería un shell de nivel 2.
Cómo mostrar el nivel de Shell
No debería sorprender, según el título del artículo, que la forma en que puede saber en qué nivel de shell se está ejecutando es mediante la variable $ SHLVL.
Para ver el nivel de shell que está ejecutando actualmente, escriba lo siguiente:
echo $ SHLVL
De manera bastante interesante, si ejecuta el comando anterior dentro de una ventana de terminal, puede sorprenderse al ver que el resultado devuelto es 2.
Sin embargo, si ejecuta el mismo comando usando tty, el resultado es 1.
¿Por qué es este el caso que podría preguntar? Bueno, el entorno de escritorio que está ejecutando se está ejecutando sobre un shell. Ese shell sería el nivel 1. Cualquier ventana de terminal que abra desde ese entorno de escritorio debe ser hija del shell que abrió el entorno de escritorio y, por lo tanto, el nivel de shell no puede comenzar en ningún otro número que no sea 2.
El tty no ejecuta un entorno de escritorio y, por lo tanto, es simplemente un shell de nivel 1.
Cómo crear subshells
La forma más fácil de probar el concepto de carcasas y subcasas es la siguiente. Abre una ventana de terminal y escribe lo siguiente:
echo $ SHLVL
Como sabemos por una ventana de terminal, el nivel mínimo de shell es 2.
Ahora dentro de la ventana del terminal escriba lo siguiente:
sh
El comando sh solo ejecuta un shell interactivo, lo que significa que está utilizando un shell dentro de un shell o una subshell.
Si ahora escribes esto de nuevo:
echo $ SHLVL
Verá que el nivel de shell se establece en 3. Al ejecutar el comando sh desde la subshell se abrirá una subshell de la subshell y el nivel de shell estará en el nivel 4.
¿Por qué es importante el nivel de Shell?
El nivel de shell es importante cuando se piensa en el alcance de las variables dentro de sus scripts.
Comencemos con algo simple:
dog = maisieecho $ dog Si ejecuta el comando anterior en un shell, la palabra maisie se mostrará en la ventana del terminal. Abra un nuevo shell escribiendo lo siguiente: sh Si ejecuta este comando verá que en realidad no se devuelve nada: echo $ dog Esto se debe a que la variable $ dog solo está disponible en el nivel de shell 2. Si escribe exit para salir de la subshell y ejecuta echo $ dog nuevamente, la palabra maisie se mostrará de nuevo. También vale la pena pensar en el comportamiento de las variables globales dentro de un shell. Comience en una nueva ventana de terminal y escriba lo siguiente: export dog = maisieecho $ dog Como era de esperar, se muestra la palabra maisie. Ahora abre una subshell y escribe echo $ dog otra vez. Esta vez verá que se muestra la palabra maisie aunque se encuentre en una subshell. La razón de esto es que el comando de exportación hizo que la variable $ dog fuera global. Cambiar la variable $ dog dentro de la subshell incluso si usa el comando export no tiene efecto en sus shells principales. Con suerte, a partir de esto, puede ver que saber el nivel de shell en el que está trabajando tiene cierta importancia al escribir scripts. Los ejemplos que he dado son muy simplistas, pero es bastante común que una secuencia de comandos de shell llame a otra secuencia de comandos de shell, que a su vez llama a otra secuencia de comandos de shell, todas ellas ahora en diferentes niveles. Conocer el nivel de shell puede ser muy importante.