¿Cuál es la diferencia entre .bashrc, .bash_profile y .environment?
He usado varios sistemas diferentes basados en *nix a lo largo 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 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 hacerlo?
¿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 alguna vez relevantes? ¿Cuáles son las diferencias entre cuáles 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 (incluido Mac OS X (y su Terminal.app) y Cygwin Bash)?
La principal diferencia con los archivos de configuración de shell es que algunos sólo 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 que se llaman, digamos, .login
o .profile
o .zlogin
(dependiendo del shell que estés usando).
Luego tiene archivos de configuración que son leídos por shells "interactivos" (como los conectados a una 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.
bash
Esto complica esto porque solo .bashrc
lo lee 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_profile
que también lean .bashrc
con algo como
[[ -r ~/.bashrc ]] && . ~/.bashrc
Otros shells se comportan de manera diferente; por ejemplo, with zsh
, .zshrc
siempre se lee para un shell interactivo, ya sea para iniciar sesión o no.
La página del manual de bash explica las circunstancias bajo las cuales se lee cada archivo. Sí, el comportamiento es generalmente consistente entre máquinas.
.profile
es simplemente el nombre del archivo del script de inicio de sesión utilizado originalmente por /bin/sh
. bash
, siendo generalmente compatible con versiones anteriores /bin/sh
, se leerá .profile
si existe uno.
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 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. Tienen otras formas de leer y exportar variables de entorno al momento de iniciar sesión.
Lea también el INVOCATION
capítulo del manual. Dice "Los siguientes párrafos describen cómo bash ejecuta sus archivos de inicio". , creo que es acertado :) También explica qué es un shell "interactivo".
Bash no sabe nada .environment
. Sospecho que es un archivo de su distribución, para configurar variables de entorno independientes del shell que maneja.
Clásicamente, ~/.profile
lo utiliza Bourne Shell y probablemente Bash lo admita como medida heredada. Nuevamente, ~/.login
fueron ~/.cshrc
utilizados por C Shell; no estoy seguro de que Bash los use en absoluto.
Se ~/.bash_profile
usaría una vez, al iniciar sesión. El ~/.bashrc
script se lee cada vez que se inicia un shell. Esto es análogo a /.cshrc
C Shell.
Una consecuencia es que el contenido ~/.bashrc
debe ser lo más liviano (mínimo) posible para reducir la sobrecarga al iniciar un shell sin inicio de sesión.
Creo que el ~/.environment
archivo es un archivo de compatibilidad para Korn Shell.
Encontré información sobre .bashrc y .bash_profile aquí para resumirlo:
.bash_profile se ejecuta cuando inicia sesión. Lo que coloque allí podría ser su RUTA y otras variables de entorno importantes.
.bashrc se utiliza para shells sin inicio de sesión. No estoy seguro de lo que eso significa. Sé que RedHat lo ejecuta cada vez que inicias otro shell (su para este usuario o simplemente llamando a bash nuevamente). Es posible que desees 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 cambió para permitir que otros shells (csh, sh, tcsh) también lo usen. (no necesitas uno como usuario)
También hay .bash_logout que se ejecuta en, sí, buena suposición... cerrar sesión. Quizás quieras detener a los demonios o incluso hacer un poco de limpieza. También puede agregar "borrar" allí si desea borrar la pantalla cuando cierra la sesión.
También hay un seguimiento completo de cada uno de los archivos de configuración aquí.
Probablemente estas incluso dependan de la distribución, no todas las distribuciones eligen tener todas las configuraciones con ellas y algunas tienen incluso más. Pero cuando tienen el mismo nombre, suelen incluir el mismo contenido.
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 los shells de inicio de sesión y sin inicio de sesión; cuando configura una RUTA, desea que se aplique a ambos. Puede solucionar este problema obteniendo .bashrc de su archivo .bash_profile y 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á .bashrc.