Esta respuesta requiere algo de experiencia y conocimiento de scripting de shell con los términos variable, valor, sustitución de variable, prompt, echo, kernel, shell, utilidad, sesión y proceso.
Una variable de entorno (envar) es un conjunto de variables definidas globales que pueden afectar la forma en que un determinado proceso se comportará en el sistema operativo de una computadora.
1. Una introducción ejemplar:
Sustituimos envars con letras mayúsculas$
y minúsculas . Por ejemplo: $PS1
.
Podemos imprimir un envar de esta manera:
echo $PS1
$PS1
contiene el valor de la solicitud de Unix. Digamos que sus valores nativos son \u
\w
$
.
\u
significa usuario (actual),
\w
significa directorio de trabajo,
$
es bordear la solicitud.
Entonces, si lo hacemos:, echo $PS1
vemos los valores de \u
, \w
más el signo de dólar al final.
Podríamos cambiar el comportamiento de Unix en ese contexto, si cambiamos los valores de ese envar. Por ejemplo:
PS1="\w >"
Ahora el indicador se ve así (suponiendo que el directorio de trabajo se llame "John"):
John >
De la misma manera que podríamos hacer PS1="Hello, I'm your prompt >"
, entonces echo $PS1
traerá:
Hello, I'm your prompt >
En Bash 4.xx, podemos imprimir TODOS los envars en el sistema con el env
comando. Sugiero ejecutar env
en la terminal y echar un vistazo a la salida.
2. Cómo se muestran y manipulan estos datos:
El terminal de una sesión nos permite personalizar los envars que vienen con Bash.
Los cambios antes mencionados suelen ser temporales, y he aquí por qué:
Cada sesión (que no es una sub-sesión) es única, y varios procesos pueden ejecutarse de manera única al mismo tiempo (cada uno con su propio conjunto de envars), pero generalmente hay herencia de la sesión 0 a la sesión 1 y hacia arriba.
Los cambios que hacemos en un proceso son exclusivos y cesarán si lo cerramos sin guardarlos de alguna manera.
Entonces, ¿cómo podemos guardar estos cambios?
Hay varios tipos de formas disponibles para almacenar cambios envar, dependiendo del alcance que elijamos. Aquí hay diferentes ámbitos (niveles) para tales cambios:
- Nivel de proceso: los envars solo están disponibles para programas en la sesión actual.
- Nivel de exportación: los envars están disponibles para programas en la sesión actual, o en todas sus sub-sesiones.
- Nivel global: los cambios se almacenarán para todas las sesiones (primaria y todas las subs).
Dónde se almacenan los datos envar:
Unix está construido con 3 capas principales: Kernel, shell y utilidades. AFAIK cada shell tiene sus propios envars, y estos se construyen primaria o exclusivamente en el shell.
La ubicación específica en la que cambiar globalmente estos es, por lo general, /etc/profile
aunque también podemos hacerlo, por .bashrc
supuesto.
3. Crear nuevos envars:
Podemos crear nuevos envars y aquí hay un camino; a partir de Bash 4.xx no se nombra enavar nativo MESSAGE
(como se dijo, los envars suelen estar en mayúsculas).
MESSAGE="Hello world!"
lo creará para nosotros, y ahora si escribimos echo $MESSAGE
, obtenemos hello world!
.
Si ejecutamos bash
en nuestra sesión de trabajo actual (ventana), comenzaríamos una nueva sub-sesión de bash y ya no funcionará en el proceso original, a menos que ejecutemos exit
.
Nota: En los sistemas operativos con un emulador de terminal (como el escritorio de Ubuntu), una sesión secundaria generalmente se ejecuta en la misma ventana, pero una sesión nueva en otra ventana no es una sesión secundaria de la existente (es un proceso adyacente ) .
Nota: ¡No use signos especiales en valores envar como! o no serán salvados.
Exportar el envar de la sesión original a todas las sub-sesiones:
Todavía podemos usar el envar creado en la primera sesión, también en la segunda, sin registrarlo en el usuario o en los archivos conf de nivel global (ver los siguientes datos). Aquí se explica cómo hacerlo:
Vaya a la sesión original (ya sea en la ventana actual u otra) y ejecute:
export MESSAGE
al exportar, no use una $
señal.
Ahora se exporta a todas las sub-sesiones. Si lo hará echo $MESSAGE
en una subsesión, ya sea de su usuario u otro, se imprimirá.
Tenga en cuenta que las variables internas de Shell, como por ejemplo PS1
, no deben exportarse, pero si desea exportarlas por cualquier motivo y no aparecen, no ejecute bash
después export
, sino más bien bash –norc
.
4. El $ PATH envar:
$PATH
es el envar que los usuarios suelen cambiar más.
Si nosotros echo $PATH
, vamos a ver esta transmisión:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Los valores impresos de este envar están separados por dos puntos (:) allí, pero aquí hay una forma potencialmente más cómoda (estos son los mismos valores):
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games
Estas son direcciones que buscar cuando ejecutamos una utilidad.
Al ejecutar which echo
, obtendremos su ubicación de archivo; por ejemplo, podríamos ver que existe en /bin/echo
.
En base a eso, no tenemos que escribir echo envar para ver los valores de evnar. También podemos hacer:
/bin/echo $ENVAR
El envar todavía se ejecutará, por ejemplo:
/bin/echo $HOME
Nos da
/home/User || /root
Tal como:
echo $HOME
Nos da
/home/User || /root
Nota: $HOME
se abrevia como ~
.
El sistema- $ PATH relaciones, y una posible interacción del usuario:
En Bash 4.xx, cuando usamos una utilidad sin su ruta completa, el sistema usará los 6 valores mencionados anteriormente, del $PATH
envar. Entonces, comenzará desde /user/local/bin
y seguirá todo su contenido buscando el echo
ejecutable.
En este caso, se detendrá en /bin/echo
, en el que, en este caso, el ejecutable reside.
Por lo tanto, la razón principal por la que podríamos personalizar el $PATH
envar es instalar archivos ejecutables que no están bajo ninguno de sus valores nativos.
Después de instalar dichos ejecutables, deberíamos establecer su $PATH
valor en consecuencia y luego podríamos trabajar con ellos.
5. Apéndice - expandiendo $PATH
:
Podemos export $PATH
bash sesiones secundarias (que incluye extensiones bash como WP-CLI para WordPress o Drush para Drupal) de esta manera:
export PATH="/home/John:$PATH"
Esto agregará un nuevo valor /home/John
y $PATH
, luego, anexará cualquier valor nativo (justo después de los dos puntos), que se almacenan bajo la sintaxis $PATH
.
Tal cambio permanente se puede hacer en la secuencia de comandos relevante, generalmente debajo /etc/profile
y por el nombre .bashrc
.
exec(3)
familia (es decir, aquellos que no coinciden con exec * v) pasan ** entorno bajo las coberturas.exec*e
variantes las que pasan explícitamente una env, en lugar de utilizar implícitamente laenviron
variable global. Elv
"vector" significa, y se refiere a los argumentos de línea de comandos pasados como una matriz (en lugar de una "lista" (función de longitud variable))execve
es una llamada al sistema, y todas las otrasexec*
funciones son las envolturas libc para ello.