sirve script que programacion pasar parametros para operaciones manejo español entorno ejemplos comandos cadenas aritmeticas bash unix environment-variables environment

script - Establecer la variable de entorno para una llamada de programa en bash usando env



shell script linux español (4)

Estoy intentando invocar un comando de shell con un entorno modificado a través del comando env .

De acuerdo con el manual

env HELLO=''Hello World'' echo $HELLO

debería hacer eco de Hello World , pero no es así. Si lo hago

HELLO=''Hello World'' bash -c ''echo $HELLO''

imprime Hello World como se esperaba (gracias a esta respuesta para esta información).

¿Que me estoy perdiendo aqui?

Saludos, Niklas


Aquí hay una forma más fácil de confirmar que Shell funciona como se espera.

env A=42 env env

El primer comando ejecuta los conjuntos A a 42 y ejecuta env . El segundo comando también ejecuta ejecuciones env . Compara el resultado de ambos.


Creo que lo que sucede es similar a esta situación en la que también estaba desconcertado.

En pocas palabras, la expansión variable en el primer caso se realiza mediante el shell actual que no tiene $HELLO en su entorno. En el segundo caso, sin embargo, las comillas simples evitan que el shell actual haga la expansión de la variable, por lo que todo funciona como se espera.

Tenga en cuenta cómo cambiar comillas simples a comillas dobles impide que este comando funcione de la manera que desee:

HELLO=''Hello World'' bash -c "echo $HELLO"

Ahora esto estará fallando por la misma razón que el primer comando en su pregunta.


Es porque en su primer caso, su caparazón actual expande la variable $ HELLO antes de ejecutar los comandos. Y no hay una variable HELLO establecida en su shell actual.

env HELLO=''Hello World'' echo $HELLO

Hará esto:

  • expanda cualquier variable dada, en este caso $ HOLA
  • ejecute env con los 3 argumentos ''HELLO = Hello World'', ''echo'' y '''' (una cadena vacía, ya que no hay una variable HELLO establecida en el shell actual)
  • El comando env se ejecutará y configurará HELLO = ''Hello World'' en su entorno
  • env ejecutará echo con el argumento '''' (una cadena vacía)

Como puede ver, el shell actual expandió la variable $ HELLO, que no está configurada.

HELLO=''Hello World'' bash -c ''echo $HELLO''

Hará esto:

  • establecer la variable HELLO=''Hello World para el siguiente comando
  • ejecuta bash con los 2 argumentos ''-c'' y ''echo $ HELLO''
  • dado que el último argumento está entre comillas simples, todo lo que está dentro de él no está expandido
  • el nuevo bash a su vez ejecutará el comando echo $HELLO
  • Para ejecutar echo $ HELLO en el nuevo subconjunto bash, bash primero expande todo lo que puede, $ HELLO en este caso, y el shell principal lo establece en "Hello World" para nosotros.
  • La subshell ejecuta echo ''Hello World''

Si intentaste hacer esto, por ejemplo:

env HELLO=''Hello World'' echo ''$HELLO''

  • El shell actual expandiría todo lo que pudiera, lo que no es nada, ya que $ HELLO está entre comillas simples
  • ejecute env con los 3 argumentos ''HELLO = Hello World'', ''echo'' y ''$ HELLO''
  • El comando env se ejecutará y configurará HELLO = ''Hello World'' en su entorno
  • env ejecutará echo con el argumento ''$ HELLO''

En este caso, no hay shell que expanda $ HELLO, por lo que echo recibe la cadena $HELLO e imprime eso. La expansión variable se realiza solo con shells.


Esto funciona y es bueno para mí

$ MY_VAR=''Hello'' ANOTHER_VAR=''World!!!'' && echo "$MY_VAR $ANOTHER_VAR" Hello World!!!