¿Cuál es la diferencia entre .bashrc, .bash_profile y .environment?

130

He utilizado varios sistemas basados ​​en * nix diferentes de los años, y parece que cada versión de Bash que uso tiene un algoritmo diferente para decidir qué scripts de inicio ejecutar. Para fines de tareas como configurar variables de entorno y alias e imprimir mensajes de inicio (por ejemplo, MOTD), ¿qué script de inicio es el lugar apropiado para hacer esto?

¿Cuál es la diferencia entre poner las cosas en .bashrc, .bash_profiley .environment? También he visto otros archivos, como .login, .bash_loginy .profile; son estos alguna vez relevantes? ¿Cuáles son las diferencias en las que se ejecutan al iniciar sesión físicamente, iniciar sesión de forma remota a través de ssh y abrir una nueva ventana de terminal? ¿Existen diferencias significativas entre plataformas (incluyendo Mac OS X (y su Terminal.app) y Cygwin Bash)?

Adam Rosenfield
fuente

Respuestas:

73

La principal diferencia con los archivos de configuración de shell es que algunos solo se leen mediante shells de "inicio de sesión" (por ejemplo, cuando inicia sesión desde otro host o inicia sesión en la consola de texto de una máquina Unix local). estos son los llamados, por ejemplo, .logino .profileo .zlogin(dependiendo de la shell que esté utilizando).

Luego tiene archivos de configuración que se leen mediante shells "interactivos" (como en los conectados a un terminal (o pseudo-terminal en el caso de, por ejemplo, un emulador de terminal que se ejecuta bajo un sistema de ventanas). Estos son los que tienen nombres como .bashrc, .tcshrc, .zshrc, etc.

bashcomplica esto ya que solo.bashrc es leído por un shell que es interactivo y sin inicio de sesión , por lo que encontrarás que la mayoría de las personas terminan diciéndoles .bash_profileque también lean .bashrccon algo como

[[ -r ~/.bashrc ]] && . ~/.bashrc

Otros shells se comportan de manera diferente, por ejemplo zsh, con , .zshrcsiempre se lee para un shell interactivo, ya sea uno de inicio de sesión o no.

La página del manual para bash explica las circunstancias bajo las cuales se lee cada archivo. Sí, el comportamiento es generalmente consistente entre máquinas.

.profilees simplemente el nombre de archivo del script de inicio de sesión utilizado originalmente por /bin/sh. bash, siendo generalmente compatible con versiones anteriores /bin/sh, leerá .profilesi existe.

Cos
fuente
48

Así de simple. Se explica en man bash:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

Los shells de inicio de sesión son los que se leen uno al iniciar sesión (por lo tanto, no se ejecutan simplemente al iniciar xterm, por ejemplo). Hay otras formas de iniciar sesión. Por ejemplo, usando un administrador de pantalla X. Esos tienen otras formas de leer y exportar variables de entorno al momento de iniciar sesión.

Lea también el INVOCATIONcapítulo en el manual. Dice "Los siguientes párrafos describen cómo bash ejecuta sus archivos de inicio". , creo que es un spot-on :) Explica qué es un shell "interactivo" también.

Bash no sabe nada .environment. Sospecho que es un archivo de su distribución, para establecer variables de entorno independientes del shell que maneja.

Johannes Schaub - litb
fuente
1
¿Podría agregar /etc/bashrcpara completar la respuesta?
Nemoden
9

Clásicamente, ~/.profilees utilizado por Bourne Shell, y probablemente sea compatible con Bash como medida heredada. Nuevamente, ~/.loginy ~/.cshrcfueron utilizados por C Shell: no estoy seguro de que Bash los use en absoluto.

El ~/.bash_profilese usaría una vez, al iniciar sesión. El ~/.bashrcscript se lee cada vez que se inicia un shell. Esto es análogo a /.cshrcC Shell.

Una consecuencia es que el contenido ~/.bashrcdebe ser lo más liviano (mínimo) posible para reducir la sobrecarga al iniciar un shell sin inicio de sesión.

Creo que el ~/.environmentarchivo es un archivo de compatibilidad para Korn Shell.

Jonathan Leffler
fuente
7

Encontré información sobre .bashrc y .bash_profile aquí para resumirlo:

.bash_profile se ejecuta cuando inicia sesión. Las cosas que pones allí pueden ser tu RUTA y otras variables de entorno importantes.

.bashrc se usa para shells sin inicio de sesión. No estoy seguro de lo que eso significa. Sé que RedHat lo ejecuta cada vez que inicia otro shell (su para este usuario o simplemente llamando a bash nuevamente) Es posible que desee poner alias allí, pero nuevamente, no estoy seguro de lo que eso significa. Simplemente lo ignoro yo mismo.

.profile es el equivalente de .bash_profile para la raíz. Creo que el nombre se ha cambiado para permitir que otros shells (csh, sh, tcsh) también lo usen. (no necesita uno como usuario)

También hay .bash_logout que se ejecuta en, sí, supongo ... cerrar sesión. Es posible que desee detener los demonios o incluso hacer un poco de limpieza. También puede agregar "borrar" allí si desea borrar la pantalla cuando cierre la sesión.

También hay un seguimiento completo de cada uno de los archivos de configuración aquí.

Probablemente estos dependan incluso de la distribución, no todas las distribuciones eligen tener cada configuración con ellos y algunos tienen aún más. Pero cuando tienen el mismo nombre, generalmente incluyen el mismo contenido.

Filip Ekberg
fuente
4

Según Josh Staiger , Terminal.app de Mac OS X en realidad ejecuta un shell de inicio de sesión en lugar de un shell sin inicio de sesión de forma predeterminada para cada nueva ventana de terminal, llamando a .bash_profile en lugar de .bashrc.

Él recomienda:

La mayoría de las veces no desea mantener dos archivos de configuración separados para shells de inicio de sesión y sin inicio de sesión: cuando establece una RUTA, desea que se aplique a ambos. Puede solucionar esto obteniendo .bashrc de su archivo .bash_profile, luego colocando PATH y configuraciones comunes en .bashrc.

Para hacer esto, agregue las siguientes líneas a .bash_profile:

if [ -f ~/.bashrc ]; then 
    source ~/.bashrc 
fi

Ahora, cuando inicie sesión en su máquina desde una consola, se llamará a .bashrc.

Rose Perrone
fuente
2

Un buen lugar para mirar es la página de manual de bash. Aquí hay una versión en línea. Busque la sección "INVOCACIÓN".

PolyThinker
fuente
0

He usado distribuciones de la familia Debian que parecen ejecutarse .profile, pero no .bash_profile, mientras que los derivados RHEL se ejecutan .bash_profileantes .profile.

Parece ser un desastre cuando tienes que configurar variables de entorno para que funcionen en cualquier sistema operativo Linux.

sismick
fuente