Recientemente noté que tenemos 3 opciones para establecer variables de entorno:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Si hay otras formas, infórmenos.
¿Cuándo debería preferir una sobre la otra? Sugiera pautas.
En cuanto a la compatibilidad de shell, ¿cuál es la más amplia (cubre más dialectos de shell)?
Ya noté esto respuesta pero deseo ampliar la pregunta con env
y pautas de preferencia de uso.
Respuesta
export VARIABLE_NAME="some value"
es la forma de establecer una variable de entorno en cualquier shell compatible con POSIX (sh
, dash
, bash
, ksh
, etc .; también zsh). Si la variable ya tiene un valor, puede usar export VARIABLE_NAME
para convertirla en una variable de entorno sin cambiar su valor.
Pre-POSIX Bourne shells no admitían esto, por lo que» verá scripts que evitan export VARIABLE_NAME="some value"
y usan VARIABLE_NAME="some value"; export VARIABLE_NAME
en su lugar. Pero los shells Bourne anteriores a POSIX son extremadamente raros hoy en día.
setenv VARIABLE_NAME="some value"
es la sintaxis csh para establecer una variable de entorno. setenv
no existe en sh, y csh se usa muy raramente en scripts y ha sido superado por bash para uso interactivo durante los últimos 20 años (y zsh por más tiempo), por lo que puede olvidarlo a menos que lo encuentras.
El comando env
raras veces es útil, excepto en shebang lines . Cuando se invoca sin argumentos, muestra el entorno, pero export
lo hace mejor (ordenado y, a menudo, citado para desambigua las líneas nuevas en los valores de las líneas nuevas que separan los valores). Cuando se invoca con argumentos, ejecuta un comando con variables de entorno adicionales, pero el mismo comando sin env
también funciona (VAR=value mycommand
ejecuta mycommand
con VAR
establecido en value
, como env VAR=value mycommand
). La razón por la que env
es útil en la línea shebang es que realiza PATH
búsqueda, y no hace nada más cuando se invoca con un comando nombre. El comando env
puede ser útil para ejecutar un comando con solo unas pocas variables de entorno con -i
, o sin parámetros para mostrar el entorno, incluidas las variables. con nombres no válidos que el shell no importa.
Respuesta
Estableciendo una variable como VAR="asdf"
deja el entorno sin modificar, lo que significa que los programas que inicie en la misma sesión no sabrán nada sobre VAR
y no podrán acceder a él. Desea este comportamiento al escribir scripts de shell .
export
, por otro lado, es una función integrada de bash que modifica el entorno, haciendo que la variable exportada sea visible para los procesos secundarios generados en la sesión actual. puede lograr lo mismo ejecutando VAR="asdf" %program_name%
.
env
no es un programa incorporado, sino un programa en sí mismo. la superficie funciona exactamente igual que cuando VAR="asdf" %program_name%
, pero en el nivel inferior las cosas se complican un poco más. Primero, se lanza env
. Modifica el entorno y luego ejecuta el comando con los argumentos dados. El mismo comportamiento que puede lograr en su propio código usando exec (3) llamada al sistema.
setenv
es solo export
en shells de la familia csh, como se indica en su respuesta.
Comentarios
Respuesta
Hay varias preguntas con respuestas que responden a esto:
-
Diferencia entre las variables de shell que se exportan y las que no están en bash
-
¿Cuál es la diferencia de uso entre las variables de shell y las variables de entorno?
(etc.)
VAR=asdf
actualiza el entorno siVAR
ya estaba en el entorno. (Esto no era ' t cierto en el shell Bourne original).