Scripts de inicio de Bash

febrero 13, 2010

profile, bash_profile, bashrc… Hay tantos ficheros de inicialización que lee bash cuando arranca que resulta complicado saber para qué está cada uno de ellos y en dónde escribir nuestros cambios. Voy a ver si consigo aclarar un poco el embrollo.

Lo primero que hay que comprender es que bash puede funcionar en dos modos diferentes:

  • Interactivo: el conectado a un terminal, en el que el ususario teclea comandos y ve los resultados. Se puede forzar con -i
  • No interactivo: los comandos se leen de un fichero o similar, pero no los teclea un usuario.

Además puede tener dos roles:

  • Shell de login: El primero que se lanza cuando se entra en sesión (tecleando usuario y contraseña) en una consola de texto. Se puede forzar con la opción –login
  • Shell de no-login: Los que se lanzan desde una sesión ya abierta, o en un pseudo-terminal (terminal gráfico, por ejemplo).

Así que hay un total de ¡4 posibilidades diferentes!, aunque un shell de login no interactivo no es algo muy habitual.

Y los ficheros que pueden leerse al inicio son básicamente los siguientes:

  • /etc/profile
  • /etc/bash.bashrc
  • ~/.bashrc
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

¡Qué lío! Pero vayamos por partes…

Los ficheros ~/.bash_profile, ~/.bash_login y ~/.profile tienen la misma función (luego la veremos), si existe el primero no se lee el segundo, y si existe el segundo no se lee el tercero. La idea es que el último es usado por otros shells, así que no debe tener construcciones específicas de bash. Y es habitual que si existe ~/.bash_profile, encadene una llamada a ~/.profile.

# .bash_profile
if [ -f ~/.profile ]; then
    . ~/.profile
fi

Ahora viene lo interesante:
Un shell de login (interactivo o no) ejecuta /etc/profile y luego ~/.bash_profile, ~/.bash_login o ~/.profile.
Un shell de no-login interactivo ejecuta /etc/bash.bashrc y ~/.bashrc.
Un shell de no-login no interactivo no ejecuta ningún fichero.
Además una sesión gráfica (de ventanas) ejecuta /etc/profile y ~/.profile (la versión general, no ~/.bash_profile).

Es habitual, aunque no se hace siempre, que /etc/profile llame a /etc/bash.bashrc si es un shell interactivo; que ~/.bash_profile llame a ~/.profile; y que ~/.profile llame a ~/.bashrc.

La idea general es incluir en los scripts *profile comandos que hagan algo que solo se deba hacer una vez por sesión (un log, por ejemplo) o que cambien algo heredable por los procesos hijos, como las variables de entorno, umask, ulimit y cosas así.
En los scripts *bashrc se escriben comandos que modifican el shell actual, pero no son heredables, como los alias o los completion.

¿Todavía no queda claro? A ver si con un esquema me explico mejor:

Diagrama de inicialización de bash

Diagrama de inicialización de bash

Artículos relacionados:

  1. Ver imágenes con LESS El comando less de GNU es mucho más que un...
  2. Automake fácil Con frecuencia me preguntan qué entorno de desarrollo utilizo para...
  3. Colorear la salida del compilador con sed ¿Alguna vez te has perdido intentando distinguir los errores entre...
  4. C++, GDB y Python Descarga el fichero aquí. Hace unos días, construyendo una versión...

4 Responses to “Scripts de inicio de Bash”

  1. Oye, no es por malmeter, pero ya que precisamente hablas de Bash, la categoría no sería GNU?

    La verdad que la explicación me ha aclarado las cosas :)
    Saludos.

  2. Ui! no me ha dejado poner la etiqueta después de la pregunta :P

  3. Joer otra vez… la etiqueta ‘talibán mode’ quería decir jeje.

  4. Técnicamente sí, claro, Bash es parte de GNU y no de Linux. Pero el caso es que la mayoría de la gente llama simplemente Linux a su sistema GNU/Linux (yo incluido :-/), y la mayoría de los usuarios de Linux usan Bash como shell, y la mayoría de los que usan Bash lo hacen en Linux.
    Así que por la utilidad de las categorías, lo he puesto en Linux. Y por precisión lo he añadido a GNU también.

Deja un comentario