¿Cuál es la diferencia entre env, setenv, export y cuando usar?

Recientemente noté que tenemos 3 opciones para establecer variables de entorno:

  1. export envVar1=1
  2. setenv envVar2=2
  3. 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

  • En los shells modernos, VAR=asdf actualiza el entorno si VAR ya estaba en el entorno. (Esto no era ' t cierto en el shell Bourne original).

Respuesta

Deja una respuesta

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