Si corro
export TEST=foo
echo $TEST
Sale foo.
Si corro
TEST=foo echo $TEST
No es asi. ¿Cómo puedo obtener esta funcionalidad sin usar exportar o un script?
shell
environment-variables
echo
ashleysmithgpu
fuente
fuente

Respuestas:
Esto se debe a que el shell expande la variable en la línea de comando antes de que realmente ejecute el comando y en ese momento la variable no existe. Si utiliza
funcionará.
exporthará que la variable aparezca en el entorno de los comandos ejecutados posteriormente (para ver cómo funciona esto en bash seehelp export). Si solo necesita que la variable aparezca en el entorno de un comando, use lo que ha intentado, es decir:fuente
$TESTantes de que se ejecute la línea de comando. Una vez que seechoestá ejecutando (también tenga en cuenta queechogeneralmente se traducirá en el comando incorporado del shell y no en/bin/echo), ve la variable establecida en su entorno. Sin embargo,echo $TESTno le indicaechoa la salida el contenido de la variableTESTde su entorno. Le dice al shell que se ejecuteechocon el argumento que sea lo que sea actualmente en la variable llamadaTEST, y esas son dos cosas muy diferentes.var=value sh -c 'echo "$var"'?"… $var …") pero no dentro de comillas simples (por ejemplo,'… $var …'). Comoecho "$var"está dentro de comillas simples, toda la cadena se pasa al nuevosh -cshell ( ) sin ser interpretada por el shell externo e interactivo. … (Continúa)sh -cshell hijo ( ).Sospecho que desea tener variables de shell para tener un alcance limitado, en lugar de variables de entorno. Las variables de entorno son una lista de cadenas que se pasan a los comandos cuando se ejecutan .
En
Estás pasando la
var=valuecadena al entorno que recibe echo. Sin embargo,echono hace nada con su lista de entornos y, de todos modos, en la mayoría de los shells,echoestá integrado y, por lo tanto, no se ejecuta .Si hubieras escrito
Eso hubiera sido otro asunto. Aquí, pasamos
var=valuealshcomando yshutilizamos su entorno. Los shells convierten cada una de las variables que reciben de su entorno en una variable de shell, por lo que lavarvariable de entorno queshrecibe se convertirá en una$varvariable, y cuando se expanda en esaecholínea de comando, se convertiráecho value. Debido a que el entorno se hereda por defecto,echotambién recibirávar=valueen su entorno (o lo haría si se ejecutara), pero nuevamente,echono le importa el entorno.Ahora, si sospecho que lo que quiere es limitar el alcance de las variables de shell, hay varios enfoques posibles.
Portablemente (Bourne y POSIX):
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 esperaría que el código anterior arroje "1: valor" y "2:" o "2: whatever-var-was-set-to-before".
Con la mayoría de los shells tipo Bourne, puede usar funciones y el "local" incorporado:
Con zsh, puede usar funciones en línea:
o:
Con bash y zsh (pero no ash, pdksh o AT&T ksh), este truco también funciona:
Una variante que funciona en unos pocos más conchas (
dash,mksh,yash) pero nozsh(a menos que en elsh/kshla emulación):(el uso
commanden frente de un builtin especial (aquíeval) en los shells POSIX elimina su especialidad (aquí las asignaciones de variables de ellos permanecen vigentes después de que han regresado)fuente
Lo estás haciendo correctamente, pero la sintaxis de bash es fácil de malinterpretar: podrías pensar que eso
echo $TESThaceechoqueTESTenv env env y luego lo imprima, no lo hace. Así dadoentonces
implica la siguiente secuencia:
El shell analiza la línea de comando completa y ejecuta todas las sustituciones variables, por lo que la línea de comando se convierte en
Crea los valores temporales establecidos antes del comando, por lo que guarda el valor actual
TESTy lo sobrescribe con 456; la línea de comando es ahoraEjecuta el comando restante, que en este caso imprime 123 en stdout (por lo que el comando de shell que queda ni siquiera usó el valor temporal de
TEST)Restaura el valor de
TESTUtilice printenv en su lugar, ya que no implica la sustitución de variables:
fuente
printenvútil para probar / probar el concepto (se comporta como lo hace un script, en lugar deecho)Puede hacer que esto funcione usando:
fuente
TEST=foose ejecuta como una declaración separada, no solo se establece en el contexto deecho.