Saltar al contenido

¿Cómo configuro una variable de entorno en la línea de comandos y hago que aparezca en los comandos?

Ya no tienes que investigar más por todo internet ya que estás al espacio perfecto, poseemos la solución que buscas pero sin liarte.

Solución:

Esto se debe a que el shell expande la variable en la línea de comando antes de en realidad ejecuta el comando y en ese momento la variable no existe. Si utiliza

TEST=foo; echo $TEST

funcionará.

export hará que la variable aparezca en el entorno de los comandos ejecutados posteriormente (para ver cómo funciona esto en bash, consulte help export). Si solo necesita que la variable aparezca en el entorno de un comando, use lo que ha probado, es decir:

TEST=foo your-application

La sintaxis de shell describe esto como siendo funcionalmente equivalente a:

export TEST=foo
your-application
unset TEST

Vea la especificación para más detalles.

Sospecho que quieres tener cáscara Las variables tienen un alcance limitado, en lugar de las variables de entorno. Las variables de entorno son una lista de cadenas que se pasan a los comandos cuando se ejecutan. ejecutado.

En

var=value echo whatever

estas pasando el var=value string al entorno que recibe el eco. Sin embargo, echo no hace nada con su lista de entornos¹ y, de todos modos, en la mayoría de los shells, echo está integrado y, por lo tanto, no ejecutado.

si hubieras escrito

var=value sh -c 'echo "$var"'

Eso hubiera sido otro asunto. Aquí, estamos pasando var=value hacia sh comando, y sh pasa a utilizar su entorno. Los shells convierten cada una de las variables que reciben de su entorno en una variable de shell, por lo que el var Variable ambiental sh recibe se convertirá en un $var variable, y cuando la expande en esa echo línea de comando, que se convertirá echo value. Debido a que el entorno se hereda por defecto, echo también recibirá var=value en su entorno (o lo haría si se ejecutara), pero de nuevo, echo no le importa el medio ambiente.

Ahora, si como sospecho, lo que quiere es limitar el alcance de las variables de shell, hay varios enfoques posibles.

Portabilidad (Bourne y POSIX):

(var=value; echo "1: $var"); echo "2: $var"

El (…) anterior inicia un sub-shell (un nuevo proceso de shell en la mayoría de los shells), por lo que cualquier variable declarada allí solo afectará a ese sub-shell, por lo que espero que el código anterior genere “1: valor” y “2: ” o “2: cualquiera que sea la variable que se haya configurado antes”.

Con la mayoría de los shells tipo Bourne, puede usar funciones y el incorporado “local”:

f() 
  local var
  var=value
  echo "1: $var"

f
echo "2: $var"

Con zsh, puede usar funciones en línea:

() local var=value; echo "1: $var"; ; echo "2: $var"

o:

function  local var=value; echo "1: $var"; ; echo "2: $var"

Con bash y zsh (pero no con ash, pdksh o AT&T ksh), este truco también funciona:

var=value eval 'echo "1: $var"'; echo "2: $var"

Una variante que funciona en algunas conchas más (dash, mksh, yash) pero no zsh (a menos que en sh/ksh emulación):

var=value command eval 'echo "1: $var"'; echo "2: $var"

(usando command frente a un edificio especial (aquí eval) en los shells POSIX elimina su especialización (aquí las asignaciones de variables en ellos permanecen en vigor después de que hayan regresado))


¹ Estrictamente hablando, eso no es completamente true. Varias implementaciones se preocuparán por las variables de entorno de localización (LANG, LOCPATH, LC_*…), la implementación de GNU se preocupa por la POSIXLY_CORRECT variable de entorno (comparar env echo --version con POSIXLY_CORRECT=1 env echo --version en un sistema GNU).

Lo estás haciendo correctamente, pero la sintaxis de bash es fácil de malinterpretar: podrías pensar que echo $TEST causas echo ir a buscar TEST env var luego imprímalo, no lo hace. tan dado

export TEST=123

entonces

TEST=456 echo $TEST

implica la siguiente secuencia:

  1. El shell analiza toda la línea de comando y ejecuta todas las sustituciones de variables, por lo que la línea de comando se convierte en

    TEST=456 echo 123
    
  2. Crea las variables temporales establecidas antes del comando, por lo que guarda el valor actual de TEST y lo sobrescribe con 456; la línea de comando es ahora

    echo 123
    
  3. Ejecuta el comando restante, que en este caso imprime 123 en la salida estándar (por lo que el comando de shell que queda ni siquiera usó el valor temporal de TEST)

  4. Restaura el valor de TEST

Utilice printenv en su lugar, ya que no implica la sustitución de variables:

>> export TEST=123
>> printenv TEST
123
>> TEST=456 printenv TEST
456
>> printenv TEST && TEST=456 printenv TEST && TEST=789 printenv TEST && printenv TEST
123
456
789
123
>>

No se te olvide difundir este enunciado si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *