Todo sobre Apple, Android, Juegos Apks y Sitios de Peliculas

Exportación de variables en Bash: el por qué y el cómo

Exportación de variables en Bash; ¿Por qué se hace y cómo se puede hacer bien? Este artículo le enseñará sobre subcapas y ejemplificará la exportación de variables de Bash con ellas, mostrándole cómo exportar variables y cómo evitar errores.

Exportar variables en Bash

Al desarrollar scripts más complejos en Bash, que emplean, por ejemplo, subshell y configuraciones de procesos de subprocesos múltiples y/o en segundo plano, uno tendrá que pasar regularmente variables del shell maestro a un subshell. Es exactamente en este tipo de situaciones donde resulta interesante exportar variables de shell.

¿Qué es un subcapa bash?

Un subshell Bash, o un shell secundario, no es más que un intérprete de línea de comando Bash (en otras palabras, el shell Bash) reiniciado desde dentro de sí mismo. Por lo tanto, el proceso original se ha convertido en el proceso maestro, y el segundo proceso que se iniciará (el que se inició dentro del proceso maestro, o primero) será la subcapa. Si el proceso/shell maestro termina, también lo hará el subshell que se ejecuta dentro de él.

Hagamos esto de manera muy simple de la siguiente manera:

bash

echo $$

ps -ef | grep -v grep | grep your_process_id

Nada pareció suceder cuando escribimos bash en la terminal y presionamos enter. Sin embargo, lo que sucedió en segundo plano fue que se inició un nuevo proceso (la subcapa) e inmediatamente entró en esa subcapa.

Podemos verificar lo mismo comprobando qué tipo de procesos están activos. Primero, descubrimos el PID (proceso ID) de nuestra (sub)capa actual. Podemos hacerlo inspeccionando la variable $$ con eco. El PID es 362827. A continuación, podemos hacer nuestra lista de procesos usando ps -ef y excluimos el proceso grep de la lista con la negación grep -v en | grep -v grep.

Descubrimos que el PPID (el proceso padre ID) de nuestra subcapa con PID 362827 es 362815 (primer cuadro verde). El PID (el proceso ID del programa mencionado al final de la línea) siempre se muestra a la izquierda, mientras que el proceso padre ID (PPID) siempre se muestra a la derecha. Esto nos permite retroceder tanto como podamos o queramos llegar.

Así descubrimos que el proceso 362815 (el proceso principal/padre que aloja el subshell 362827) es propiedad del proceso 13185 (resaltado en blanco), y este proceso se identifica por el último ps como la ventana de terminal que se inició en el entorno de escritorio. Esto, a su vez, es propiedad de un proceso 2184 iniciado mucho antes (el nombre del proceso no se muestra aquí), etc.

La jerarquía total (visible) es así 2184 > 13185 (ventana de terminal) > 362815 (maestro/shell principal dentro de la ventana de terminal) > 362827 (el subshell comenzó desde dentro del shell Bash con el proceso ID 362815). Para obtener una representación más visible de esta jerarquía, es posible que desee consultar el comando/utilidad pstree, que puede requerir instalación en su sistema operativo.

Para obtener más información sobre los PID de Unix, consulte ¿Qué son los PID de Unix y cómo funcionan? por Anthony Heddings.

Es importante comprender cómo funciona la jerarquía de Bash, ya que nos ayuda a comprender por qué y dónde la exportación de variables se vuelve interesante y, a menudo, necesaria.

Exportar variables a subcapas

Hay muchas formas de crear una subcapa. Una forma es simplemente iniciar un subshell como se muestra arriba escribiendo bash y ejecutando más comandos basados ​​en la línea de comandos. Otra es iniciar una sesión de pantalla GNU (consulte Cómo utilizar la utilidad GNU Screen en Linux si desea obtener más información sobre GNU Screen).

También puedes usar el modismo de subshell $(el código de subshell va aquí) directamente desde una línea de comando y/o tus scripts Bash. Finalmente, se puede iniciar una subcapa simplemente colocando un proceso en segundo plano. Para obtener más información sobre la gestión de procesos en segundo plano, consulte Gestión de procesos en segundo plano de Bash.

Entonces, con todos estos métodos para iniciar subshells, ¿cómo se pueden pasar fácilmente variables de un shell a otro? Claro, se podrían almacenar las variables en un archivo (en cualquier formato), pero esto aumentará la cantidad de operaciones de E/S y la complejidad del código Bash que maneja esta escritura y lectura de variables.

Hay una manera más fácil. Puede considerarlo como variables globales en otros lenguajes de codificación. Sí, tal vez las variables globales tiendan a ser evitadas o mal vistas, pero recuerde que aquí estamos tratando con procesos separados.

En cualquier programación multiproceso/multiproceso en cualquier lenguaje, todavía habría un módulo/código de supervisión que pasaría variables de un lado a otro entre los subprocesos. Estas variables podrían considerarse global también.

La sintaxis del comando de exportación es muy sencilla. Simplemente anteponga la asignación de variable con el comando de exportación:

export A=1

B=2

bash

echo ${A}

echo ${B}

Aquí comenzamos un subshell y mostramos cómo la variable A se pasó correctamente al subshell usando el comando exportar al definirla. También vemos como la variable B no se ha transferido al subshell, ya que fue definida sin usar export.

La propiedad de exportación es una propiedad específica que se puede activar y desactivar para una variable determinada. Se activa fácilmente utilizando el prefijo del comando de exportación al definir la variable.

Una vez que se establece dicha propiedad, permanece activa. Esto es algo a tener en cuenta al codificar, ya que puede generar resultados confusos si no se conoce esta operación específica. Es fácil asumir que uno está “reutilizando” una variable con el mismo nombre, o incluso usar accidentalmente un nombre de variable similar de diferentes scripts en el subshell, etc. Exploremos un ejemplo:

export C=1

export D=

D=1

bash

echo ${C}

echo ${D}

En este ejemplo vemos que la variable D conserva su propiedad de exportación, incluso cuando se reasigna sin el comando de exportación explícito, y su valor se pasa correctamente al subshell.

La propiedad de exportación también se puede eliminar o desactivar para una variable usando la opción -n para exportar. Sin embargo, para que sea efectivo, esto debe hacerse desde el shell maestro/principal, y no desde el subshell:

export -n D

echo ${D}

exit

echo ${D}

bash

echo ${D}

Este ejemplo continúa desde el último (es decir, aún desde dentro del subnivel activo). Intentamos eliminar el exportar propiedad de la variable D y, posteriormente, salga del subshell usando exit. Vemos que al regresar al shell principal nuestra variable D ha retenido su valor, y ese valor permanece retenido al volver a ingresar a un nuevo subshell. Por lo tanto, como se ve, una propiedad de exportación no se puede eliminar de una variable dentro de un subshell si a esa variable se le dio una propiedad de exportación en el shell principal/maestro.

Esto es similar a otros métodos de codificación Bash: el subshell no puede afectar al shell maestro/principal. Esto también tiene más sentido desde una perspectiva de seguridad en muchos casos, y la seguridad es probablemente la razón por la que los desarrolladores de Bash eligieron implementarlo de esta manera. Vayamos un paso más allá ahora y eliminemos el exportar propiedad del shell principal/padre:

exit

export -n D

bash

echo ${D}

Aquí salimos del subshell que acabamos de crear en el último ejemplo y luego desarmamos el exportar propiedad de la variable D. A continuación, volvemos a ingresar a una subcapa similar a nuestro último ejemplo, y podemos ver que nuestra variable D está vacía, ya que ya no se exportó a la subcapa. También puede ejecutar export -p para ver todas las variables de exportación. Es probable que las variables que exportó se encuentren en la parte superior de esta lista.

export -p | head -n1

Conclusión

Habiendo explorado los subniveles y su conexión con la exportación de variables Bash, a continuación ejemplificamos la exportación de variables Bash. Analizamos varias formas de exportar variables, así como un método para borrar el exportar propiedad de las variables. También vimos un problema que puede surgir si reutilizas nombres de variables. ¡Disfruta Exportando!