¿Cuál es el significado de las comillas simples y dobles en las variables de entorno?

19

Definí algunas variables de entorno en mi .profile de esta manera:

MY_HOME="/home/my_user"

pero la variable no parece evaluarse a menos que elimine las comillas y vuelva a buscar el archivo. Creo que las comillas son necesarias si habrá espacios, y las comillas simples se usan si no se desean escapes. ¿Alguien puede aclarar la importancia de las comillas simples y dobles en las definiciones de variables? ¿Qué hay de las garrapatas frontales y de la espalda?

2NinerRomeo
fuente

Respuestas:

23

Creo que estás confundido acerca de la terminología.

Una "variable de entorno" es simplemente una variable de shell que cualquier proceso hijo heredará.

Lo que está haciendo en su ejemplo es crear una variable de shell. No está en el medio ambiente hasta que lo exporte:

MY_HOME="/home/my_user"
export MY_HOME

coloca una variable llamada "MY_HOME" en casi todos los shells (excepto csh, tcsh).

En este caso particular, las comillas dobles son superfluas. No tienen efecto. Subcadenas de grupo de comillas dobles, pero permite que cualquier shell que use realice una sustitución de variables. Las comillas simples agrupan subcadenas y evitan la sustitución. Dado que su asignación de ejemplo no contiene ninguna variable, las comillas dobles podrían haber aparecido como comillas simples.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Nada está en el entorno hasta que lo exporte.

Bruce Ediger
fuente
18

Variables de shell frente a variables de entorno

MY_HOME="/home/my_user"establece la variable de shell llamada MY_HOME. Los shells son lenguajes de programación y tienen variables (también llamadas parámetros). Después de esta asignación, puede usar el valor de la variable, por ejemplo, con echo "$MY_HOME".

Las variables de shell son un concepto de shell interno. Cuando esa instancia de shell finaliza, MY_HOMEse olvida. Lo que cada programa sabe y transmite a sus hijos son las variables de entorno .

Dentro del shell, las variables de entorno y las variables de shell funcionan de manera muy similar. Lo que realmente sucede es que todas las variables de entorno que el shell hereda de su padre se convierten en variables de shell. Por el contrario, una variable de shell que se define en un script de shell se convertirá en una variable de entorno si la exporta .

export MY_HOME="/home/my_user"

Más detalles que puedes omitir en la primera lectura

La razón por la cual las variables de shell no se convierten automáticamente en variables de entorno es, en parte, que un script puede usar accidentalmente un nombre de variable que es significativo para un programa que lanza, y en parte solo histórico.

Se requieren algunos shells muy antiguos exportcada vez que se cambia el nombre de una variable, pero todos los shells modernos realizan un seguimiento de las asignaciones de las variables de entorno, de modo que el siguiente fragmento haga eco bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

Además, algunos shells muy antiguos requerían comandos separados para myvar=fooy export myvar, pero todos los shells modernos lo entienden export myvar=foo.

Puede ejecutar set -apara hacer que todas las asignaciones de variables de shell exporten automáticamente la variable, por lo que myvar=fooes equivalente a export myvar=foosi ejecutó set -aprimero en ese shell.

En la cita

Las citas son mayormente ortogonales. Si el valor que está asignando a la variable no contiene ningún carácter que sea especial para el shell, no necesita comillas. Si hay caracteres especiales, debe protegerlos con comillas simples o comillas dobles o barras invertidas o una combinación de ellas. Esto se aplica tanto a la myvar=valuesintaxis simple como a la exportutilidad.

Hay una diferencia entre la sintaxis de asignación y la exportsintaxis. El shell expande aún más los resultados de las sustituciones variables $foo, realizando división de campo (palabra) y expansión de nombre de ruta (globbing) . Esto significa que si el valor de myvares hello ​ *, entonces echo $myvarimprime helloseguido de un solo espacio seguido de la lista de archivos en el directorio actual. Esto casi nunca es deseable, por lo tanto, el principio general que utilice siempre comillas dobles sustituciones de variables (a menos que usted sabe que necesita nombre de ruta de expansión o la división de campos): echo "$myvar". En el caso de una asignación simple, othervar=$myvarde hecho, fiable copia el valor de myvaraothervar, porque el bloqueo y la división de palabras se inhiben en las asignaciones (porque crean varias palabras, pero se espera una sola palabra). exportSin embargo, esta dispensación no se aplica a . Entonces, si desea recordar una regla simple, use siempre comillas dobles alrededor de sustituciones variables.

Gilles 'SO- deja de ser malvado'
fuente
¿Puede explicar "Citar es mayormente ortogonal". en la sección "Sobre cotizaciones"? No entiendo el significado de ortogonal en esa oración.
DK Bose
1
@DKBose Significa que las variables de entorno frente a shell, por un lado, y las citas, por otro lado, son dos problemas separados que tienen poco que ver entre sí. Wiktionary significados 4 y 5.
Gilles 'SO- deja de ser malvado'