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

He usado varios sistemas diferentes * nix de los últimos años, y parece que cada sabor de Bash que uso tiene un algoritmo diferente para decidir qué scripts de inicio ejecutar. Para propósitos de tareas como configurar variables de entorno y alias e imprimir mensajes de inicio (por ejemplo, MOTD), ¿qué secuencia de comandos de inicio es el lugar apropiado para hacer esto?

¿Cuál es la diferencia entre poner cosas en .bashrc , .bash_profile y .environment ? También he visto otros archivos como .login , .bash_login y .profile ; ¿son estos relevantes alguna vez? ¿Cuáles son las diferencias entre ejecutar uno 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)?

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 inicias sesión desde otro host, o inicias sesión en la consola de texto de una máquina Unix local). estos son los llamados, digamos, .login o .profile o .zlogin (dependiendo de qué shell está usando).

Luego tiene archivos de configuración que son leídos por shells “interactivos” (como en, unos conectados a un terminal (o pseudo-terminal en el caso de, digamos, un emulador de terminal corriendo bajo un sistema de ventanas). Estos son los que tienen nombres como .bashrc , .tcshrc , .zshrc , etc.

bash complica esto porque .bashrc solo es leído por un intérprete de comandos que es tanto interactivo como no de inicio de sesión , por lo que encontrarás que la mayoría de la gente termina diciéndole a .bash_profile que también lea .bashrc con algo como

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

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

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

.profile es simplemente el nombre de archivo del script de inicio de sesión usado originalmente por /bin/sh . bash , que generalmente es compatible con versiones anteriores /bin/sh , leerá .profile si existe.

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 cuando simplemente se inicia xterm, por ejemplo). Hay otras formas de iniciar sesión. Por ejemplo, utilizando un administrador de visualización X. Esos tienen otras formas de leer y exportar variables de entorno en el momento del inicio de sesión.

Lea también el capítulo INVOCATION en el manual. Dice “Los siguientes párrafos describen cómo bash ejecuta sus archivos de inicio”. , creo que es un spot-on 🙂 También explica qué es un shell “interactivo”.

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

Clásicamente, Bourne Shell usa ~/.profile , y es probablemente compatible con Bash como una medida heredada. Nuevamente, ~/.login y ~/.cshrc fueron utilizados por C Shell – No estoy seguro de que Bash los use en absoluto.

El ~/.bash_profile se usará una vez, al iniciar sesión. El script ~/.bashrc se lee cada vez que se inicia un shell. Esto es análogo a /.cshrc para C Shell.

Una consecuencia es que las cosas en ~/.bashrc deben ser tan livianas (mínimas) como sea posible para reducir los gastos generales cuando se inicia un shell que no es de inicio de sesión.

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

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

.bash_profile se ejecuta cuando inicias sesión. Las cosas que pongas ahí podrían ser tu RUTA y otras variables importantes del entorno.

.bashrc se usa para shells que no son de 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 llama a bash nuevamente). Puede que quiera 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 ha cambiado para permitir que otros shells (csh, sh, tcsh) lo utilicen también. (no necesita uno como usuario)

También hay .bash_logout que se ejecuta en, sí, supongo … cierre la sesión. Es posible que desee detener los deamons 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 en cada uno de los archivos de configuraciones aquí

Probablemente estas sean incluso dependientes de la distribución, no todas las distribuciones eligen tener cada configuración con ellas y algunas tienen aún más. Pero cuando tienen el mismo nombre, generalmente incluyen el mismo contenido.

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

Él recomienda:

La mayoría de las veces no desea mantener dos archivos de configuración separados para los shells de inicio de sesión y los que no inician sesión: cuando establece un PATH, desea que se aplique a ambos. Puede solucionar esto obteniendo .bashrc de su archivo .bash_profile, luego poniendo 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 invocará .bashrc.

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

He utilizado las distribuciones de la familia Debian que parecen ejecutar .profile , pero no .bash_profile , mientras que los derivados RHEL ejecutan .bash_profile antes de .profile .

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