sirven que permanentes para las hat guardan entorno ejemplos donde crear bash shell environment-variables command-line-arguments

bash - permanentes - ¿Establecer una variable de entorno en la misma línea que la ejecución del programa es diferente a configurarla por separado?-variables de shell vs. variables de entorno



variables de entorno linux export (2)

El VAR=value command formato VAR=value command establece la variable VAR para que tenga el valor value en el entorno del command . La sección de especificaciones que cubre esto es los comandos simples . Específicamente:

De lo contrario, las asignaciones de variables se exportarán para el entorno de ejecución del comando y no afectarán al entorno de ejecución actual, excepto como un efecto secundario de las expansiones realizadas en el paso 4.

El formato VAR=value; command VAR=value; command establece la variable de shell VAR en el shell actual y luego ejecuta el command como un proceso secundario. El proceso hijo no sabe nada acerca de las variables establecidas en el proceso de shell.

El mecanismo por el cual un proceso exporta (sugerencia de pista) una variable para que la vean los procesos secundarios es establecerlos en su entorno antes de ejecutar el proceso secundario. El shell incorporado que hace esto es export . Esta es la razón por la que a menudo ve export VAR=value y VAR=value; export VAR VAR=value; export VAR .

La sintaxis que está discutiendo es una forma corta para algo similar a:

VAR=value export VAR command unset -v VAR

Sólo sin utilizar el entorno de proceso actual en absoluto.

Cuál es la diferencia entre:

prompt$ TSAN_OPTIONS="suppressions=/somewhere/file" ./myprogram

y

prompt$ TSAN_OPTIONS="suppressions=/somewhere/file" prompt$ ./myprogram

La biblioteca de thread-sanitizer proporciona el primer caso sobre cómo obtener su biblioteca (utilizada dentro de mi programa) para leer el archivo que figura en las opciones. Lo leí, y asumí que se suponía que eran dos líneas separadas, así que lo ejecuté como el segundo caso.

La biblioteca no usa el archivo en el segundo caso, donde la variable de entorno y la ejecución del programa están en líneas separadas.

¿Cual es la diferencia?

Pregunta extra: ¿Cómo se ejecuta el primer caso sin errores? ¿No debería haber una; o && entre ellos? La respuesta a esta pregunta probablemente responde a mi primera ...


Para complementar la útil respuesta de Etan Reisner :

Es importante distinguir entre variables de shell y variables de entorno :

Nota: lo siguiente se aplica a todos los shells compatibles con POSIX; bash extensiones específicas están marcadas como tales.

Una variable de shell es una construcción específica del shell que se limita al shell que la define (con la excepción de los subshells , que obtienen sus propias copias de las variables del shell actual),
mientras que una variable de entorno es heredada por cualquier proceso secundario creado por el proceso actual (shell), ya sea que ese proceso secundario sea un shell o no.
Tenga en cuenta que los nombres de las variables en mayúsculas solo se deben usar para las variables de entorno .

De cualquier manera, un proceso hijo solo hereda copias de variables, cuya modificación (por parte del hijo) no afecta al padre .

  • Todas las variables de entorno también son variables de shell (el shell garantiza que),
  • pero lo inverso NO es cierto : las variables de shell NO son variables de entorno, a menos que se designen o hereden explícitamente como tales ; esta designación se denomina exportar .
    • tenga en cuenta que la opción -a shell desactivada por defecto (establecida con el set -a , o pasada al shell como una opción de línea de comando) puede usarse para exportar automáticamente todas las variables de la shell.

Así,

  • cualquier variable que cree implícitamente por asignación, por ejemplo, TSAN_OPTIONS="suppressions=/somewhere/file" - son SOLO variables de shell, pero NO TAMBIÉN son variables de entorno,
  • EXCEPTO - quizás confusamente - cuando se agrega directamente a un comando - por ejemplo, TSAN_OPTIONS="suppressions=/somewhere/file" ./myprogram - en cuyo caso son SOLO variables de entorno , solo en efecto para ESE COMANDO .
    • Esto es lo que describe la respuesta de Etan.

Las variables de shell se convierten en variables de entorno también en las siguientes circunstancias:

  • basado en variables de entorno que el shell mismo heredó, como $HOME
  • variables de shell creadas explícitamente con export varName[=value] o, en bash , también con declare -x varName[=value]
    • por el contrario, en bash , el uso de declare sin -x , o el uso de local en una función, crea meras variables de shell
  • variables de shell creadas implícitamente mientras que la opción off-default -a shell está vigente (con excepciones limitadas)

Una vez que una variable de shell se marca como exportada , es decir, se marca como una variable de entorno, cualquier cambio posterior en la variable de shell también actualiza la variable de entorno ; p.ej:

export TSAN_OPTIONS # creates shell variable *and* corresponding environment variable # ... TSAN_OPTIONS="suppressions=/somewhere/file" # updates *both* the shell and env. var.

  • export -p imprime todas las variables de entorno
  • unset [-v] MYVAR undefine shell variable $MYVAR y también la elimina como una variable de entorno, si corresponde.
  • en bash
    • Puede "no exportar" una variable dada sin también definirla como una variable de shell con la export -n MYVAR - esto elimina MYVAR del entorno, pero conserva su valor actual como una variable de shell .
    • declare -p MYVAR imprime el valor actual de la variable $MYVAR junto con sus atributos; si la salida comienza con declare -x , $MYVAR se exporta (es una variable de entorno)