variable usuario usar una setear hat entorno como agregar bash eval

bash - usuario - ¿Cómo imprimir/eco variables de entorno?



variables de entorno linux bash (4)

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

NAME=sam; echo $NAME

¿Cómo imprimo la variable de entorno que se acaba de configurar?

NAME=sam echo "$NAME" # empty

Puedes ver aquí usando eval funciona. ¿Es esta la forma?

NAME=sam eval ''echo $NAME'' # => sam


Estos deben ir como comandos diferentes, por ejemplo:

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

La expansión de $NAME para vaciar la cadena la realiza el shell antes, antes de ejecutar echo , por lo que en el momento en que la variable NAME pasa al entorno del comando echo , la expansión ya está terminada (en una cadena nula).

Para obtener el mismo resultado en un comando:

NAME=sam printenv NAME


La sintaxis

variable=value command

a menudo se utiliza para establecer variables de entorno para un proceso específico. Sin embargo, debe comprender qué proceso obtiene qué variable y quién la interpreta. Como ejemplo, utilizando 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.


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

Como se indicó, el problema con NAME=sam echo "$NAME" es que $NAME se expande con el shell actual antes de que la asignación NAME=sam surta efecto.

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

Use eval [1] (como en la pregunta en sí), 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 una variable de entorno
  • que solo se define para el comando que se invoca .

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

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

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

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

Si bien producen la misma salida , en su lugar definen:

  • una variable de shell NAME (solo) en lugar de una variable de entorno
    • Si echo fuera un comando que dependía de la variable de entorno NAME , no se definiría (o podría definirse de manera diferente a la anterior).
  • que vive después de la orden.

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

[1] Técnicamente, bash infringe POSIX aquí (como lo es zsh ): dado que eval es un shell especial incorporado, la asignación NAME=sam precedente debe hacer que la variable $NAME permanezca en el alcance después de que finalice el comando. pero eso no es lo que pasa.
Sin embargo, cuando ejecuta bash en el modo de compatibilidad POSIX, es compatible.
dash y ksh son siempre compatibles.
Las reglas exactas son complicadas, y algunos aspectos se dejan a las implementaciones para decidir; de nuevo, vea Búsqueda de comandos y ejecución .