Cómo imprimir / echo variables de entorno?


¿Cómo puedo imprimir la variable de entorno que se acaba de establecer?

NAME=sam echo "$NAME" # empty

Puedes ver aquí usando eval funciona. Es este el camino?

NAME=sam eval 'echo $NAME' # => sam
 26
Author: chepner, 2016-10-14

4 answers

Estos deben ir como comandos diferentes, por ejemplo:

NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"

La expansión $NAME a la cadena vacía se realiza por el shell antes, antes de ejecutar echo, por lo que en el momento en que la variable NAME se pasa al entorno del comando echo, la expansión ya está hecha (a la cadena nula).

Para obtener el mismo resultado en un comando:

NAME=sam printenv NAME
 29
Author: heemayl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-15 21:29:29

Para reunir las respuestas existentes con una aclaración importante:

Como se ha dicho, el problema con NAME=sam echo "$NAME" es que $NAME se expande por el shell actual antes de que la asignación entre en vigor.

Soluciones que preservan la semántica original (del intento de solución (ineficaz) NAME=sam echo "$NAME"):

Utilizar eval[1] (como en la pregunta misma), o printenv (como lo agregó Aaron McDaid a la respuesta de heemayl ), o bash -c (de la respuesta de Ljm Dullaart), en orden descendente de eficiencia:

NAME=sam eval 'echo "$NAME"'  # use `eval` only if you fully control the command string
NAME=sam printenv NAME
NAME=sam bash -c 'echo "$NAME"'

printenv no es una utilidad POSIX, pero está disponible tanto en Linux como en macOS / BSD.

Lo que hace este estilo de invocación (<var>=<name> cmd ...) es definir NAME:

  • como entorno variable
  • eso es solo se define para el comando que se invoca.

En otras palabras: NAME solo existe para el comando se invoca, y no tiene ningún efecto en el shell actual (si no existía ninguna variable llamada NAME antes, no habrá ninguna después; una variable preexistente NAME permanece sin cambios).

POSIX define las reglas para este tipo de invocación en su capítulo Búsqueda y Ejecución de Comandos .


Las siguientes soluciones funcionan de manera muy diferente (de la respuesta de heemayl):

NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"

Mientras producen la misma salida , en lugar de definir:

  • a shell variable NAME (solo) en lugar de una variable de entorno
    • si echo fuera un comando que dependiera de environment variable NAME, no se definiría (o potencialmente se definiría de manera diferente a la anterior).
  • que vive en después del comando.

Tenga en cuenta que cada variable de entorno también se expone como una variable shell, pero lo inverso no es cierto: las variables de shell solo son visibles para el shell actual y sus subcellentes, pero no para los procesos hijos, como las utilidades externas y los scripts (no de origen) (a menos que estén marcados como variables de entorno con export o declare -x).


[1] Técnicamente, bash está en violación de POSIX aquí (al igual que zsh): Dado que eval es un especial shell incorporado, la asignación anterior NAME=sam debería hacer que la variable $NAME permanezca en el alcance después de que el comando termine, pero eso no es lo que sucede.
Sin embargo, cuando ejecuta bash en modo de compatibilidad POSIX, es compatible con.
dash y ksh son siempre compatibles.
Las reglas exactas son complicadas, y algunos aspectos se dejan a las implementaciones para decidir; de nuevo, ver Búsqueda y Ejecución de comandos.

 3
Author: mklement0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:50

La sintaxis

variable=value command

Se usa a menudo para establecer variables de entorno para un proceso específico. Sin embargo, debe entender qué proceso obtiene qué variable y quién la interpreta. Como ejemplo, usando dos shells:

a=5
# variable expansion by the current shell:
a=3 bash -c "echo $a"
# variable expansion by the second shell:
a=3 bash -c 'echo $a'

El resultado será 5 para el primer eco y 3 para el segundo.

 2
Author: Ljm Dullaart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-15 15:41:49

Esto también funciona, con el punto y coma.

NAME=sam; echo $NAME

 2
Author: ThomasReggi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-15 15:43:22