Pregunta Diferencia entre .bashrc y .bash_profile


Cuál es la diferencia entre .bashrc y .bash_profile y cual deberia usar?


401


origen


Ver también esta pregunta similar en ubuntu.stackexchange.com/questions/1528/bashrc-or-bash-profile - Stefan Lasiewski
Si quieres una explicación más completa que también involucre .profile, eche un vistazo a esta pregunta: superuser.com/questions/789448/... - Flimm
Esta respuesta también cubre algunos aspectos stackoverflow.com/questions/415403/... - Sergey Voronezhskiy


Respuestas:


Tradicionalmente, cuando inicia sesión en un sistema Unix, el sistema iniciaría un programa para usted. Ese programa es un shell, es decir, un programa diseñado para iniciar otros programas. Es un intérprete de comandos: inicia otro programa escribiendo su nombre. El shell predeterminado, un shell Bourne, lee comandos de ~/.profile cuando se invoca como el shell de inicio de sesión.

Bash es una concha de Bourne. Lee comandos de ~/.bash_profile cuando se invoca como el shell de inicio de sesión, y si ese archivo no existe¹, intenta leer ~/.profile en lugar.

Puede invocar un shell directamente en cualquier momento, por ejemplo, ejecutando 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 inicia bash como un shell interactivo (es decir, para no ejecutar un script), lee ~/.bashrc (excepto cuando se invoca como un shell de inicio de sesión, entonces solo lee ~/.bash_profile o ~/.profile.

Por lo tanto:

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

  • ~/.bashrc es el lugar donde colocar cosas que solo se aplican a bash, como definiciones de alias y funciones, opciones de shell y configuraciones de solicitud. (También puedes poner enlaces de teclas allí, pero para bash normalmente entran en ~/.inputrc.)

  • ~/.bash_profile se puede usar en lugar de ~/.profile, pero solo se lee por bash, no por ningún otro intérprete de comandos. (Esto es más que nada preocupante si desea que sus archivos de inicialización funcionen en varias máquinas y su shell de inicio de sesión no los utiliza en todos). Este es un lugar lógico para incluir ~/.bashrc si el caparazón es interactivo. Recomiendo los siguientes contenidos en ~/.bash_profile:

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
    

En los equipos modernos, hay una complicación adicional relacionada con ~/.profile. Si inicia sesión en un entorno gráfico (es decir, si el programa donde escribe su contraseña se ejecuta en modo gráfico), no obtendrá automáticamente un shell de inicio de sesión que lea ~/.profile. Dependiendo del programa de inicio de sesión gráfico, del administrador de ventanas o del entorno de escritorio que ejecute posteriormente, y de cómo su distribución configuró estos programas, su ~/.profile puede o no ser leído. Si no es así, generalmente hay otro lugar donde puede definir variables de entorno y programas para iniciar cuando inicia sesión, pero desafortunadamente no hay una ubicación estándar.

Tenga en cuenta que puede ver aquí y allá recomendaciones para poner definiciones de variables de entorno en ~/.bashrc o siempre ejecute 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 las variables de entorno solo se establecerán en programas iniciados a través del terminal, no en programas que se inician directamente con un icono o menú o atajo de teclado.

¹  Para completar, a pedido: si .bash_profile no existe, bash también intenta .bash_loginantes de volver a caer .profile. Siéntase libre de olvidar que existe.  


471



+1 para una buena publicación. TAMBIÉN gracias por agregar la sección sobre "login graphical vs login shell" ... Tuve el problema donde pensé que ~ / .profile SIEMPRE se ejecutaría para gráficos / shell ... pero no se ejecuta cuando el usuario inicia sesión a través de un inicio de sesión gráfico Gracias por resolver ese misterio. - Trevor Boyd Smith
@Gilles: ¿Podría explicar con más detalle, con ejemplos, por qué ejecutar un shell de inicio de sesión en cada terminal es una mala idea? ¿Es esto solo un problema con el escritorio de Linux? (Entiendo que en OS X Terminal ejecuta un shell de inicio de sesión todo el tiempo, y nunca he notado ningún efecto secundario (aunque suelo usar iTerm). Pero entonces no puedo pensar en muchas variables de entorno que me importarían fuera de una terminal. (¿Tal vez HTTP_PROXY?)) - iconoclast
@Brandon Si ejecuta un shell de inicio de sesión en cada terminal, eso anulará las variables de entorno proporcionadas por el entorno. En situaciones cotidianas, puedes salirte con la tuya, pero tarde o temprano te morderá cuando quieras configurar diferentes variables en una terminal (por ejemplo, para probar una versión diferente de un programa): ejecutar una shell de inicio de sesión anularía su configuración local. - Gilles
La declaración ~/.bash_profile se puede usar en lugar de ~/.profile, pero también necesitas incluir ~/.bashrc si el caparazón es interactivo. es engañoso ya que estos son problemas ortogonales. No importa si usa ~/.bash_profile o ~/.profile tienes que incluir ~/.bashrc en el que use si desea que las configuraciones desde allí tengan efecto en el shell de inicio de sesión. - Piotr Dobrogost
@Gilles Claro, pero la forma en que se formuló la oración en la respuesta sugiere que la necesidad de incluir ~/.bashrc tiene algo que ver con la elección ~/.bash_profile en lugar de ~/.profile que no es verdad Si alguien incluye ~/.bashrc en cualquier tipo de script que se obtiene al iniciar sesión (aquí está ~/.bash_profile o ~/.profile) es porque él quiere ajustes de ~/.bashrc para aplicar al shell de inicio de sesión de la misma manera que se aplican al shell que no es de inicio de sesión. - Piotr Dobrogost


De esto artículo corto

De acuerdo con la página del hombre bash,   .bash_profile se ejecuta para iniciar sesión   shells, mientras que .bashrc se ejecuta para   caparazones interactivos sin inicio de sesión.

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

Cuando inicie sesión (p. Ej .: escriba nombre de usuario y   contraseña) a través de la consola, ya sea   físicamente sentado en la máquina cuando   arrancando, o remotamente a través de ssh:   .bash_profile se ejecuta para configurar   cosas antes del comando inicial   rápido.

Pero, si ya has iniciado sesión   su máquina y abra una nueva terminal   ventana (xterm) dentro de Gnome o KDE,   entonces .bashrc se ejecuta antes del   ventana del símbolo del sistema. .bashrc es también   ejecutar cuando inicie una nueva instancia de bash   escribiendo / bin / bash en una terminal.


50



Pequeñas actualizaciones: 'Ejecutado' es probablemente un término ligeramente engañoso, ambos son de origen. Ejecutado suena como si se ejecutara como un script, fork / exec yadda yadda. Se ejecuta en el contexto del shell actual. Más importante aún, .bashrc se ejecuta con mucha más frecuencia. Se ejecuta en cada ejecución de script bash, y también si no tiene un perfil .bash_perfil. Además, dependiendo de cómo configure sus xterms, puede crear un shell que ordene .bash_profile - Rich Homolka


En los viejos tiempos, cuando los pseudo tty no eran pseudo y en realidad, bien, mecanografiados, y los módems se accedían a los UNIX tan lentamente que se podía ver cada letra impresa en su pantalla, la eficiencia era primordial. Para ayudar un poco a la eficiencia, tenías el concepto de una ventana de inicio de sesión principal y cualquier otra ventana que usabas para trabajar realmente. En su ventana principal, desea notificaciones a cualquier correo nuevo, posiblemente ejecute algunos otros programas en segundo plano.

Para apoyar esto, las conchas obtuvieron un archivo .profile específicamente en 'shell de inicio de sesión'. Esto haría especial, una vez que la configuración de la sesión. Bash extendió esto de alguna manera para mirar .bash_profile primero antes de .profile, de esta forma podrías poner bash solo cosas ahí (para que no arruinen Bourne shell, etc, que también miró .profile). Otros shells, sin inicio de sesión, solo obtendrían el archivo rc, .bashrc (o .kshrc, etc.).

Esto es un poco anacrónico ahora. No inicie sesión en un shell principal tanto como inicie sesión en un administrador de ventanas gui. No hay una ventana principal diferente a cualquier otra ventana.

Mi sugerencia: no te preocupes por esta diferencia, se basa en un estilo anterior de uso de Unix. Elimina la diferencia en tus archivos. El contenido completo de .bash_profile debe ser:

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

Y pon todo lo que realmente quieras establecer en .bashrc

Recuerde que .bashrc tiene su origen en todas las conchas, interactivas y no interactivas. Puede cortocircuitar el origen para shells no interactivos poniendo este código cerca de la parte superior de .bashrc:

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


34



Esta es una mala idea, ver mi respuesta. En particular, las variables de entorno solo se establecerán en programas iniciados a través del terminal, no en programas que se inician directamente con un icono o menú o atajo de teclado. - Gilles
@Gilles. No entiendo por qué reclamas esto. Con .$HOME/.bashrc como Rich mostró arriba, ajustes en .bashrc estará disponible en shells de inicio de sesión y, por lo tanto, también en el entorno de escritorio. Por ejemplo, en mi sistema Fedora, gnome-session se inicia como -$SHELL -c gnome-session, asi que .profile es leído. - Mikel
@PiotrDobrogost Oh, sí, hay otro problema con la respuesta de Rich. Incluso .bashrc en .profile por lo general no funciona, porque .profile puede ser ejecutado por /bin/sh y no bash (por ejemplo, en Ubuntu para un inicio de sesión gráfico por defecto), y ese shell puede no ser interactivo (por ejemplo, para un inicio de sesión gráfico). - Gilles
@Gilles re: "incluir .bashrc en .profile" no es en absoluto lo recomendado (todo lo contrario, de hecho). O la respuesta fue editada (no parece) o tus comentarios no se alinean con lo que se dice. - michael
En general, +1, pero me gustaría añadir a la recomendación de "cortocircuito ... para proyectiles no interactivos" ("cerca de la cima de .bashrc: [[ $- != *i* ]] && return"); Me gusta algo de mi .bashrc para ser ejecutado incluso para shells no interactivos, específicamente para establecer variables, al emitir ssh hostname {command}, para que los comandos remotos se ejecuten correctamente (aunque el shell no sea interactivo). Pero otras configuraciones más adelante en .bashrc debe ser ignorado Normalmente verifico TERM = tonto y / o desarmado, y luego salgo temprano. - michael


Echa un vistazo a esto excelente publicación de blog por ShreevatsaR. Aquí hay un extracto, pero ve a la entrada del blog, incluye una explicación de términos como "shell de inicio de sesión", un diagrama de flujo y una tabla similar para Zsh.

Para Bash, funcionan de la siguiente manera. Lee la columna apropiada. Ejecuta A, luego B, luego C, etc. El B1, B2, B3 significa que ejecuta solo 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      |           |      |
+----------------+-----------+-----------+------+

14



En lugar de publicar la misma respuesta en varias preguntas, se prefiere si puede adaptar su respuesta a las necesidades específicas del solicitante. Si la respuesta es exactamente la misma para ambas preguntas, entonces debe publicar una sola respuesta y votar para cerrar las otras preguntas como duplicados del original. - Mokubai♦
@Mokubai La otra pregunta ya ha sido marcada como un duplicado de esta. - Flimm
@ ElipticalView: por configurar para no hacer nada, te estás refiriendo a la línea: [ -z "$PS1" ] && return? La tabla en mi respuesta es la lista de scripts ejecutados por Bash independientemente del contenido de los scripts, si el script en sí tiene la línea [ -z "$PS1" ] && return, por supuesto, eso tendría efecto, pero no creo que eso signifique que deba cambiar la mesa. - Flimm


UN MEJOR COMENTARIO PARA EL JEFE DE / ETC / PROFILE

Sobre la base de la gran respuesta de Flimm anterior, inserté este nuevo comentario al principio de mi Debian / etc / profile, (Es posible que deba ajustarlo para su distribución).:

# 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 cabeza de cada uno de los otros archivos de configuración para referirse a ella:

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

Vale la pena señalar que creo que es / etc / profile de Debian por fuentes predeterminadas (incluye) /etc/bash.bashrc (que es cuando /etc/bash.bashrc existe). De modo que las secuencias de comandos de inicio de sesión leen los archivos / etc, mientras que el inicio de sesión solo lee bash.bashrc.

También es de notar que /etc/bash.bashrc está configurado para no hacer nada cuando no se ejecuta de forma interactiva. Entonces estos dos archivos son solo para scripts interactivos.


3