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
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.