3.9.- Archivos de entorno

Los archivos del entorno sirven para almacenar de manera permanente las definiciones vinculadas a la configuración definida en el entorno del usuario.

Entorno de texto

Este tipo de entorno se ejecuta inmediatamente después de la identificación del usuario con el nombre login y contraseña. Este proceso es el usado desde siempre en todos los comandos que se ejecutan durante la sesión, por lo que los demás shell ejecutados posteriormente no tendrá el estatus de shell de conexión.

Entorno gráfico

 

Fondo de escritorio y barra de iconos personalizados (Ubuntu 16.10).

En el entorno gráfico, el shell de conexión se ejecuta entre la pantalla de conexión  y la visualización del escritorio. Por lo tanto este no es un shell interactivo. Todo lo que ejecutemos (escritorio, aplicaciones) desde los iconos son procesos descendientes del shell de conexión.

En la mayoría de casos, un terminal abierto desde un entorno gráfico no se considera un shell de conexión.

Sin embargo, hay algunas plataformas que permiten ejecutar desde el escritorio o bien un shell de conexión, o un shell ordinario. en estos casos los archivos del entorno usado serán diferentes para cada caso.

Archivos del entorno leídos por el shell de conexión

 El shell de conexión lee un script shell del sistema llamado /etc/profile.

Este archivo es gestionado por el administrador del sistema y contiene los parámetros comunes a todos los usuarios.

Seguidamente busca en el directorio de inicio del usuario un script de entorno cuyo nombre depende del shell usado.

¿Que poner en el archivo .profile (.bash_profile)?

 Este archivo contiene principalmente:

  • Una definición seguida de la exportación de una o varias variables: éstas se transmiten a todos los procesos lanzados a partir del shell de conexión. Las variables que son definidas sin exportarlas permanecerán como variables locales.
  • La redefinición de los parámetros del sistema como umask, características del terminal, etc, serán válidos durante toda la sesión.

Ejemplo de archivo .profile en una distribución Linux (Ubuntu 16.10).

Lo que no podemos añadir

Las entidades que no se transmiten entre procesos:

  • opciones del shell;
  • definiciones de alias.

El shell re-lee las definiciones de los alias y las opciones cada vez que se ejecuta un shell nuevo, sea con conexión o sin conexión. Existe un archivo de entorno que desempeña este papel en ksh y en bash (en Bourne Shell, no tiene ni opciones ni alias, por lo que la cuestión ni se plantea). Ya que el funcionamiento del shell bash y el ksh no son lo mismo, analizaremos cada shell por separado.

¿Como provocar la relectura de un archivo de entorno?

El archivo .profile se lee únicamente en el momento de la conexión del mismo shell. Si el usuario realiza  una modificación en su archivo .profile, éste debe ser releído por el shell. Tenemos para ello dos métodos:

  1. Desconectarse y volverse a conectar, o sea, salir del shell y volver a entrar.
  2. Hacer que el shell actual relea el script de entorno (no tiene que ser necesariamente el shell de conexión).  Para hacer que el shell relea el script debemos usar el comando interno “.” (que veremos más adelante).

Ejemplo

Visualización del valor de las variables y del parámetro umask antes de la modificación del archivo .profile.

Modificando el archivo .profile:

Ahora vamos a pedirle al shell que relea el archivo .profile:

Vemos el valor de las variables y el parámetro umask:

Sesión usando un Bourne Shell

  • ejecución de un Bourne Shell de conexión (1);
  • lectura del script en shell del sistema /etc/profile, seguidamente lee el script shell del usuario $HOME/.profile si está presente: el shell de conexión va guardando la definición de las variables (sean exportadas o no) y de los parámetros del sistema (2);
  • todos los descendientes del shell de conexión recibirán el valor de los parámetros del sistema y de las variables exportadas (3).

Sesión utilizando un Korn Shell

Debemos realizar las definiciones de las variables y parámetros en el archivo ~/.profile, las opciones y alias serán almacenadas en otro script cuyo nombre se deja a elección del usuario (por convenio ~/.kshrc).

Comportamiento de un Korn shell de conexión

  • Después de que la identificación es la correcta, se ejecuta (1).
  • Lee el script del sistema /etc/profile (2), seguidamente el script de usuario ~/.profile si está presente el shell de conexión guarda la definición de las variables (exportadas o no) y de los parámetros del sistema.
  • Si la variable ENV está definida (3), ksh considera que su valor representa el nombre de un script shell que debe leer. Por lo general, se le da  a este archivo el nombre .kshrc. Éste último esta construido para contener las definiciones de las opciones y los alias (4).

Entonces el ksh muestra su prompt instantáneamente (menos en el entorno gráfico donde el escritorio se ejecuta rápidamente). Las variables de entorno, parámetros, opciones y alias se aplican a nivel del shell de conexión (5).

Un ksh lanzado a posteriormente (6):

  • Recibirá automáticamente el valor de los parámetros del sistema y de las variables exportadas (7).
  • Si se ha recibido la variable ENV (para ello, se necesita que la hayamos exportado a nivel del archivo .profile), el ksh leerá el archivo cuyo nombre está contenido en ella, en este caso .kshrc (8).
  • Seguidamente ksh muestra su prompt. Las variables de entorno exportadas, parámetros, opciones y alias son aplicados al nivel para este nuevo shell (9).

Sesión utilizando un Bourne Again Shell

La definición de las variables y parámetros de usuario deben hacerse en el archivo ~/.bashrc.

  • El bash de conexión lee automáticamente el archivo .bash_profile, pero no el archivo .bashrc.
  • Un bash ordinario (no de conexión) e interactivo lee automáticamente el archivo ~/.bashrc.
  • Un bash ordinario y no interactivo (bash que ejecutará un script shell) lee el archivo cuyo nombre se cita en la variable BASH_ENV (debe estar definida en la variable .bash_profile). Esta acción nos permitirá  inicializar las variables de entorno únicamente para el contexto de ejecución del script shell. El siguiente ejemplo no tendrá en cuenta este caso.

Comportamiento del Bash de conexión

  • Después de la identificación se ejecuta (1).
  • Lee el script de sistema /etc/profile, seguidamente abre el script de usuario ~/bash_profile si este existe (2).
  • El comando . ~/.bashrc (3) se ha añadido para solicitar al bash de conexión la lectura del archivo .bashrc a fin de integrar la definición de los alias y de las opciones.
  • Una vez abierto el archivo .bashrc este ha sido leído, el bash de conexión lee la continuación del archivo .bash_profile (4).
  • seguidamente el bash muestra su prompt. Las variables de entorno, parámetros, opciones y alias han sido actualizados a nivel del bash de conexión (5).

Comportamiento de un bash interactivo ordinario

Un bash ejecutado posteriormente recibirá automáticamente el valor de los  parámetros del sistema y de las variables exportadas (6) y leerá automáticamente el archivo ~/.bashrc si este existe (7). El bash muestra seguidamente su prompt. Las variables de entorno, parámetros, opciones y alias han sido actualizados a nivel de este nuevo shell (6) y (8).