GNU/Linux >> Tutoriales Linux >  >> Linux

¿La diferencia en el uso entre las variables de shell y las variables de entorno?

De hecho, no sabía que hay dos tipos diferentes de variables a las que puedo acceder desde la línea de comandos. Todo lo que sabía es que puedo declarar variables como:

foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"

o accediendo a ellos con un signo $, como:

echo $foo
echo ${bar[1]}

o usando variables incorporadas, como:

echo $PWD
PATH=$PATH:"/usr/bin/myProg"

Ahora, escuché que hay dos (¿al menos?) tipos de variables:variables de shell y variables de entorno.

  • ¿Cuál es el propósito de tener dos tipos diferentes?
  • ¿Cómo sé de qué tipo es una variable?
  • ¿Cuáles son los usos típicos de cada uno?

Respuesta aceptada:

Las variables de entorno son una lista de name=value pares que existen sea cual sea el programa (shell, aplicación, daemon…). Por lo general, los heredan los procesos secundarios (creados por un fork /exec secuencia):los procesos secundarios obtienen su propia copia de las variables principales.

Las variables de shell existen solo en el contexto de un shell. Solo se heredan en subshells (es decir, cuando el shell se bifurca sin un exec operación). Dependiendo de las características de la shell, las variables pueden no ser solo cadenas simples como las del entorno, sino también matrices, variables compuestas y escritas como números enteros o coma flotante, etc.

Cuando se inicia un shell, todas las variables de entorno que hereda de su padre también se convierten en variables de shell (a menos que no sean válidas como variables de shell y otros casos de esquina como IFS que algunos shells restablecen), pero estas variables heredadas se etiquetan como exportadas. Eso significa que permanecerán disponibles para los procesos secundarios con el valor potencialmente actualizado establecido por el shell. Ese también es el caso de las variables creadas bajo el shell y etiquetadas como exportadas con export palabra clave.

La matriz y otras variables de tipo complejo no se pueden exportar a menos que su nombre y valor se puedan convertir a name=value patrón, o cuando un mecanismo específico de shell está en su lugar (por ejemplo:bash exporta funciones en el entorno y algunos shells exóticos que no son POSIX como rc y es puede exportar matrices).

Entonces, la principal diferencia entre las variables de entorno y las variables de shell es su alcance:las variables de entorno son globales, mientras que las variables de shell no exportadas son locales para el script.

Tenga en cuenta también que los shells modernos (al menos ksh y bash ) admiten un tercer alcance de variables de shell. Variables creadas en funciones con typeset Las palabras clave son locales para esa función (la forma en que se declara la función habilita/deshabilita esta función en ksh , y el comportamiento de persistencia es diferente entre bash y ksh ). Consulte https://unix.stackexchange.com/a/28349/2594

Relacionado:¿Diferencia entre "guardar registro" y "exportar registro"?

Esto se aplica a shells modernos como ksh , dash , bash y similares El shell Bourne heredado y los shells de sintaxis que no son Bourne como csh tienen diferentes comportamientos.


Linux
  1. ¿Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?

  2. ¿Cuál es la diferencia entre Sudo Su y Sudo Su?

  3. ¿La diferencia entre Getty y Agetty?

  4. ¿Diferencia entre '{}' y {} en el comando de búsqueda?

  5. ¿Cuál es la diferencia entre ls y l?

¿Cuál es la diferencia entre Linux y Unix?

¿Cuál es la diferencia entre Shell de inicio de sesión y sin inicio de sesión?

¿Cuál es la diferencia entre una consola, una terminal y un shell?

¿Cuál es la diferencia entre env y set (en Mac OS X o Linux)?

¿Cuál es la diferencia entre nohup y ampersand?

¿Cuál es la diferencia entre &> y >&en bash?