
Sé que VARIABLE=value
crea una variable de entorno y export VARIABLE=value
la pone a disposición de los procesos creados por el Shell actual. env
muestra 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 execve
página de manual:
SINOPSIS
#include <unistd.h> int execve(const char *filename, char *const argv[], char *const envp[]);
argv
es 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.envp
es 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
environ
apunta a una serie de punteros a cadenas denominada "entorno". El último puntero de esta matriz tiene el valorNULL
. (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=value
crea una variable de shell (en la mayoría de los shells). export SOME_NAME=value
crea 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/exec
método de iniciar un nuevo proceso que utilizan todos los Unix. Cuando crea export
un 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 exec
se 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 ulimit
la 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 exec
proceso recién creado.
Consulte la bash
descripció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 cd
en 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, , $HOME
y 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_PATH
ps -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 crontab
o visudo
puedes definir la EDITOR
variable de entorno para definir otro editor distinto al que tu sistema usaría por defecto. Lo mismo puede aplicarse a cosas como el man
comando que analiza su PAGER
entorno 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 PATH
variable 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_HOME
variable de entorno.
bash en sí tiene muchas variables de entorno que pueden cambiar el comportamiento de una variedad de cosas, desde el historial ( HISTSIZE
, HISTFILE
etc.), 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... ↑