2010-09-02 14:40:34 +0000 2010-09-02 14:40:34 +0000
453
453

Diferencia entre .bashrc y .bash_profile

¿Cuál es la diferencia entre .bashrc y .bash_profile y cuál debo utilizar?

Respuestas (6)

528
528
528
2010-09-02 19:23:14 +0000

Tradicionalmente, cuando te conectas a un sistema Unix, el sistema inicia un programa por ti. Ese programa es un shell, es decir, un programa diseñado para iniciar otros programas. Es un shell de línea de comandos: se inicia otro programa escribiendo su nombre. El shell por defecto, un shell Bourne, lee los comandos de ~/.profile cuando es invocado como shell de inicio de sesión.

Bash es un shell similar a Bourne. Lee los comandos de ~/.bash_profile cuando es invocado como shell de inicio de sesión, y si ese archivo no existe¹, intenta leer ~/.profile en su lugar.

Puedes invocar un shell directamente en cualquier momento, por ejemplo lanzando un emulador de terminal dentro de un entorno GUI. Si el shell no es un shell de inicio de sesión, no lee ~/.profile. Cuando se inicia bash como un shell interactivo (es decir, no para ejecutar un script), lee ~/.bashrc (excepto cuando se invoca como un shell de inicio de sesión, entonces sólo lee ~/.bash_profile o

Por lo tanto:

  • ~/.profile es el lugar para poner las cosas que se aplican a toda la sesión, como los programas que quieres iniciar cuando te conectas (pero no los programas gráficos, que van en un archivo diferente), y las definiciones de las variables de entorno.

  • ~/.profile es el lugar para poner cosas que se aplican sólo a bash, como definiciones de alias y funciones, opciones del shell y configuraciones del prompt. (También puedes poner ahí los enlaces de las teclas, pero para bash normalmente van en ~/.bashrc).

  • ~/.inputrc puede ser usado en lugar de ~/.bash_profile, pero sólo es leído por bash, no por ningún otro shell. (Esto es principalmente una preocupación si quiere que sus archivos de inicialización funcionen en múltiples máquinas y su shell de inicio de sesión no es bash en todas ellas). Este es un lugar lógico para incluir ~/.profile si el shell es interactivo. Recomiendo el siguiente contenido en ~/.bashrc:

En las unidades modernas, hay una complicación adicional relacionada con ~/.bash_profile. Si te conectas en un entorno gráfico (es decir, si el programa en el que escribes tu contraseña se ejecuta en modo gráfico), no obtienes automáticamente un shell de inicio de sesión que lea ~/.profile. Dependiendo del programa de inicio de sesión gráfico, del gestor de ventanas o del entorno de escritorio que ejecute después, y de cómo haya configurado su distribución estos programas, su ~/.profile puede ser leído o no. Si no lo es, suele haber otro lugar donde definir las variables de entorno y los programas que se lanzan al iniciar la sesión, pero lamentablemente no hay una ubicación estándar.

Tenga en cuenta que puede ver aquí y allá recomendaciones para poner las definiciones de las variables de entorno en ~/.profile o lanzar siempre los shells de inicio de sesión en los terminales. Ambas son malas ideas. El problema más común con cualquiera de estas ideas es que sus variables de entorno sólo se establecerán en los programas lanzados a través de la terminal, no en los programas iniciados directamente con un icono o menú o atajo de teclado.

¹ Para completar, a petición: si ~/.bashrc no existe, bash también intenta .bash_profile antes de volver a .bash_login. Siéntase libre de olvidar que existe.

54
54
54
2010-09-02 14:54:04 +0000

De este breve artículo

Según la página man de bash, .bash_profile se ejecuta para los shells de login, mientras que .bashrc se ejecuta para los shells interactivos de no login.

¿Qué es un shell de inicio de sesión o de no inicio de sesión?

Cuando se inicia una sesión (por ejemplo: escribir el nombre de usuario y la contraseña) a través de la consola, ya sea físicamente sentado en la máquina al arrancar, o de forma remota a través de ssh: .bash_profile se ejecuta para configurar las cosas antes del prompt de comandos inicial.

Pero, si ya has iniciado sesión en tu máquina y abres una nueva ventana de terminal (xterm) dentro de Gnome o KDE, entonces .bashrc se ejecuta antes del prompt de comandos de la ventana. .bashrc también se ejecuta cuando inicias una nueva instancia de bash escribiendo /bin/bash en una terminal.

35
35
35
2010-09-02 18:10:20 +0000

En los viejos tiempos, cuando los pseudo tty’s no eran pseudo y realmente, bueno, se tecleaba, y se accedía a los UNIX’s con módems tan lentos que podías ver cada letra impresa en tu pantalla, la eficiencia era primordial. Para ayudar a la eficiencia, se tenía el concepto de una ventana principal de inicio de sesión y cualquier otra ventana que se utilizara para trabajar realmente. En tu ventana principal, te gustaría recibir notificaciones de cualquier correo nuevo, posiblemente ejecutar algunos otros programas en segundo plano.

Para soportar esto, los shells crearon un archivo .profile específicamente en ‘login shells’. Esto haría lo especial, una vez que una sesión de configuración. Bash extendió esto de alguna manera para mirar primero en .bash_profile antes de .profile, de esta manera usted podría poner cosas de bash solamente allí (para que no arruinen el shell Bourne, etc, que también miró en .profile). Otros shells, que no sean de inicio de sesión, sólo tendrían como fuente el archivo rc, .bashrc (o .kshrc, etc).

Esto es un poco anacrónico ahora. No se entra en un shell principal tanto como en un gestor de ventanas gui. No hay una ventana principal diferente a cualquier otra ventana.

Mi sugerencia - no te preocupes por esta diferencia, está basada en un estilo más antiguo de usar unix. Elimine la diferencia en sus archivos. Todo el contenido de .bash_profile debería ser

[-f $HOME/.bashrc] && . $HOME/.bashrc

Y pon todo lo que realmente quieras configurar en .bashrc

Recuerda que .bashrc tiene un origen para todos los shells, interactivos y no interactivos. Puedes cortocircuitar la fuente para los shells no interactivos poniendo este código cerca de la parte superior de .bashrc:

[[$- != *i*]] && return

19
19
19
2016-07-13 08:53:44 +0000

Echa un vistazo a este excelente post del blog de ShreevatsaR . Aquí hay un extracto, pero ve a la entrada del blog, incluye una explicación para términos como “login shell”, un diagrama de flujo, y una tabla similar para Zsh.

Para Bash, funcionan de la siguiente manera. Lee la columna correspondiente. Ejecuta A, luego B, luego C, etc. El B1, B2, B3 significa que ejecuta sólo el primero de esos archivos encontrados.

+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profile | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profile | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+
5
5
5
2016-10-18 18:13:24 +0000

Un comentario mejor para la cabecera de /ETC/PROFILE

Basándome en la gran respuesta de Flimm, he insertado este nuevo comentario en la cabecera de mi /etc/profile de Debian, (puede que tenga que ajustarlo para su distro.):

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found. (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# | | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# | | login | non-login |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | ALL USERS: | | | |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV | | | A | not interactive or login
# | | | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile | A | | | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc | (A) | A | | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh| (A) | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh | (A) | | | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh | (A) | | |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | A SPECIFIC USER: | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile (bash only) | B1 | | | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login (bash only) | B2 | | | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile (all shells) | B3 | | | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc (bash only) | (B2) | B | | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# | | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout | C | | |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

Y esta nota en la cabecera de cada uno de los otros ficheros de configuración para hacer referencia a él:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

Creo que vale la pena señalar que el /etc/profile de Debian, por defecto, es la fuente (incluye) de /etc/bash.bashrc (esto es cuando /etc/bash.bashrc existe). Así que los scripts de inicio de sesión leen ambos archivos /etc, mientras que los de no inicio de sesión sólo leen bash.bashrc.

También hay que tener en cuenta que /etc/bash.bashrc está configurado para no hacer nada cuando no se ejecuta interactivamente. Así que estos dos archivos son sólo para los scripts interactivos.

4
4
4
2019-06-24 22:55:40 +0000

La lógica de configuración de bash en sí misma no es una locura complicada y se explica en otras respuestas en esta página, en serverfault y en muchos blogs. El problema sin embargo es lo que las distribuciones de Linux hacen de bash, me refiero a las complejas y variadas formas en que configuran bash por defecto. http://mywiki.wooledge.org/DotFiles menciona brevemente algunas de estas peculiaridades. Aquí hay un ejemplo de rastreo en Fedora 29, muestra qué archivos originan qué otro(s) archivo(s) y en qué orden para un escenario muy simple: conectarse remotamente con ssh y luego iniciar otro subshell:

ssh fedora29
 └─ -bash # login shell
      ├── /etc/profile
      | ├─ /etc/profile.d/*.sh
      | ├─ /etc/profile.d/sh.local
      | └─ /etc/bashrc
      ├── ~/.bash_profile
      | └─ ~/.bashrc
      | └─ /etc/bashrc
      |
      |
      └─ $ bash # non-login shell
            └─ ~/.bashrc
                 └─ /etc/bashrc
                       └─ /etc/profile.d/*.sh

La lógica más compleja de Fedora está en /etc/bashrc. Como se ha visto anteriormente /etc/bashrc es un archivo que el propio bash no conoce, es decir, no directamente. El /etc/bashrc de Fedora comprueba si:

  • está siendo originado por un shell de inicio de sesión,
  • está siendo originado por un shell interactivo,
  • ya ha sido originado

… y luego hace cosas completamente diferentes dependiendo de ellas.

Si crees que puedes recordar el gráfico anterior, entonces es una pena porque no es suficiente: este gráfico sólo describe un escenario, cosas ligeramente diferentes ocurren cuando se ejecutan scripts no interactivos o se inicia una sesión gráfica. He omitido el ~/.profile. He omitido los scripts bash_completion. Por razones de compatibilidad, invocar bash como /bin/sh en lugar de /bin/bash cambia su comportamiento. ¿Qué pasa con zsh y otros shells? Y, por supuesto, las diferentes distribuciones de Linux hacen las cosas de manera diferente, por ejemplo Debian y Ubuntu vienen con una versión no estándar de bash, que tiene personalizaciones específicas de Debian. En particular, busca un archivo inusual: /etc/bash.bashrc. Incluso si te ciñes a una sola distribución de Linux, probablemente evolucione con el tiempo. Espera: ni siquiera hemos tocado macOS, FreeBSD,… Por último, pensemos en los usuarios atascados en las formas aún más creativas en que sus administradores han configurado el sistema que tienen que utilizar.

Como demuestra la interminable corriente de discusiones sobre este tema, es una causa perdida. Mientras sólo quieras añadir nuevos valores, un poco de “prueba y error” suele ser suficiente. La verdadera diversión comienza cuando quieres modificar en un archivo (de usuario) algo ya definido en otro (en /etc). Entonces prepárate para pasar algún tiempo diseñando una solución que nunca será portable.

Para una última diversión aquí está el “gráfico de fuentes” para el mismo y simple escenario en Clear Linux a partir de junio de 2019:

ssh clearlinux
 └─ -bash # login shell
      ├── /usr/share/defaults/etc/profile
      | ├─ /usr/share/defaults/etc/profile.d/*
      | ├─ /etc/profile.d/*
      | └─ /etc/profile
      ├── ~/.bash_profile
      |
      |
      └─ $ bash # non-login shell
           ├─ /usr/share/defaults/etc/bash.bashrc
           | ├─ /usr/share/defaults/etc/profile
           | | ├─ /usr/share/defaults/etc/profile.d/*
           | | ├─ /etc/profile.d/*
           | | └─ /etc/profile
           | └─ /etc/profile
           └─ ~/.bashrc