¿Qué es exactamente una variable de entorno?

¿Qué es exactamente una variable de entorno?

Sé que VARIABLE=valuecrea una variable de entorno y export VARIABLE=valuela pone a disposición de los procesos creados por el Shell actual. envmuestra las variables de entorno actuales, pero ¿dónde viven? ¿Qué comprende una variable de entorno (o unaambiente, para esa materia)?

Respuesta1

Un entorno no es tan mágico como podría parecer. El shell lo almacena en la memoria y lo pasa a la execve()llamada al sistema. El proceso hijo lo hereda como un puntero de matriz llamado environ. Desde la execvepágina de manual:

SINOPSIS

   #include <unistd.h>

   int execve(const char *filename, char *const argv[],
              char *const envp[]);

argves una matriz de cadenas de argumentos pasadas al nuevo programa.
Por convención, la primera de estas cadenas debe contener el nombre del archivo asociado con el archivo que se está ejecutando. envpes una matriz de cadenas, convencionalmente con el formato clave=valor, que se pasan como entorno al nuevo programa.

La environ(7)página de manual también ofrece información:

SINOPSIS

   extern char **environ;

DESCRIPCIÓN

La variable environapunta a una serie de punteros a cadenas denominada "entorno". El último puntero de esta matriz tiene el valor NULL. (Esta variable debe declararse en el programa de usuario, pero se declara en el archivo de encabezado <unistd.h>en caso de que los archivos de encabezado provengan de libc4 o libc5, y en caso de que provengan de glibc y se haya definido _GNU_SOURCE). Esta matriz de cadenas está disponible para el proceso mediante la llamada exec(3) que inició el proceso.

Ambas páginas de manual de GNU coinciden con elespecificación POSIX

Respuesta2

Lo has entendido un poco mal: SOME_NAME=valuecrea una variable de shell (en la mayoría de los shells). export SOME_NAME=valuecrea una variable de entorno. Para bien o para mal, la mayoría de los shells de Unix/Linux/*BSD utilizan una sintaxis idéntica para acceder a las variables de entorno y a las variables del shell.

En un sentido más amplio, un "entorno" es sólo la información que acompaña a la ejecución del programa. En los programas C, puede encontrar el ID del proceso con una getpid()llamada; en un programa shell usaría un acceso variable: $$. La identificación del proceso es solo parte del entorno del programa. Creo que el término "entorno" proviene de algunos de los temas más teóricos de la informática, como el modelado de la ejecución de programas. Los modelos de ejecución de programas tienen unaambiente"que contiene las asociaciones entre variables y sus valores".

Y esta última definición, más sólida, es lo que es un "entorno" para shells Unix/Linux/*BSD: una asociación entre nombres ("variables") y sus valores. Para la mayoría de los shells de estilo Unix, los valores son todos cadenas de caracteres, aunque eso no es tan estrictamente cierto como solía ser. Ksh, Zsh y Bash tienen variables escritas hoy en día. Incluso se pueden exportar definiciones de funciones de shell.

El uso de un entorno separado de las variables de shell simples implica el fork/execmétodo de iniciar un nuevo proceso que utilizan todos los Unix. Cuando crea exportun par nombre/valor, ese par nombre/valor estará presente en el entorno de nuevos ejecutables, iniciados por el shell con una execve(2)llamada al sistema (normalmente después de fork(2), excepto cuando execse utilizó el comando shell).

Después de un execve(), la main()función del nuevo binario tiene sus argumentos de línea de comando, el entorno (almacenado como una matriz de punteros a cadenas terminada en NULL var=value, consulte la environ(7)página de manual). Otro estado heredado incluye ulimitla configuración, el directorio de trabajo actual y cualquier descriptor de archivo abierto para el que la execve()persona que llama no tenía configurado FD_CLOEXEC. El estado actual del tty (eco habilitado, modo sin formato, etc.) también podría considerarse parte del estado de ejecución heredado por un execproceso recién creado.

Consulte la bashdescripción del manual delentorno de ejecuciónpara comandos simples (que no sean funciones integradas o de shell).

El entorno Unix es diferente al menos de otros sistemas operativos: los "léxicos" de VMS pueden ser cambiados por un proceso hijo, y ese cambio es visible en el padre. Un VMS cden un proceso hijo afectaría el directorio de trabajo del padre. Al menos en algunas circunstancias, y es posible que mi memoria me esté fallando.

Algunas variables de entorno son bien conocidas, , $HOMEy otras. Algunos son convencionales para un sistema de programación determinado, de modo que un shell principal puede pasar muchísima información con fines especiales a algún programa, como un directorio temporal específico o una identificación de usuario y contraseña que no aparecen en . Los programas CGI simples heredan mucha información del servidor web, por ejemplo, a través de variables de entorno.$PATH$LD_LIBRARY_PATHps -ef

Respuesta3

Las variables de entorno en su forma más básica son solo un conjunto de pares de nombre/valor. Como se describe en la página de manual de bash ( man 1 bash) en la sección ENTORNO:

   When  a  program  is invoked it is given an array of strings called the
   environment.   This  is  a  list  of  name-value  pairs,  of  the  form
   name=value.

   The  shell  provides  several  ways  to manipulate the environment.  On
   invocation, the shell scans its own environment and creates a parameter
   for  each name found, automatically marking it for export to child pro-
   cesses.  Executed commands inherit the  environment.

En términos prácticos, le permite definir un comportamiento compartido o exclusivo de los programas invocados desde el shell actual. Por ejemplo, al usar crontabo visudopuedes definir la EDITORvariable de entorno para definir otro editor distinto al que tu sistema usaría por defecto. Lo mismo puede aplicarse a cosas como el mancomando que analiza su PAGERentorno para determinar qué programa de buscapersonas debe usarse para mostrar la salida de la página de manual.

Muchos comandos de Unix leen el entorno y, dependiendo de lo que esté configurado allí, modifican su salida/procesamiento/acción dependiendo de estos. Algunos son compartidos, otros son exclusivos del programa. La mayoría de las páginas de manual contienen información sobre cómo la variable de entorno afecta el programa descrito.

Otras ilustraciones prácticas son para sistemas con varias instalaciones de Oracle en la misma plataforma. Al configurar ORACLE_HOME, todo el conjunto de comandos de Oracle (tal como se cargan desde su PATHvariable de entorno) extrae configuraciones, definiciones, asignaciones y bibliotecas de ese directorio de nivel superior. Lo mismo ocurre con otros programas como Java con su JAVA_HOMEvariable de entorno.

bash en sí tiene muchas variables de entorno que pueden cambiar el comportamiento de una variedad de cosas, desde el historial ( HISTSIZE, HISTFILEetc.), el tamaño de la pantalla ( COLUMNS), la finalización de pestañas ( FIGNORE, GLOBIGNORE), la configuración regional y la codificación/decodificación de caracteres ( LANG, LC_*), el mensaje ( PS1.. PS4) y y así sucesivamente (nuevamente busque conocimiento en la página de manual de bash).

También puede escribir scripts/programas que utilicen sus propias variables de entorno personalizadas (para pasar configuraciones o cambiar funciones).

Respuesta4

"Variables de entorno"son un conjunto de valores dinámicos con nombre que pueden afectar la forma en que se comportarán los procesos en ejecución en una computadora.

Son parte del entorno operativo en el que se ejecuta un proceso. Por ejemplo, un proceso en ejecución puede consultar el valor de la variable de entorno TEMP para descubrir una ubicación adecuada para almacenar archivos temporales, o la variable HOME o USERPROFILE para encontrar la estructura de directorios propiedad del usuario que ejecuta el proceso.

Más información aquí →http://en.wikipedia.org/wiki/Environment_variable.

Todo lo que quieres saber sobre las variables de entorno... ↑

información relacionada