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

Resuelto Adam Rosenfield asked hace 15 años • 7 respuestas

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_profiley .environment? También he visto otros archivos como .login, .bash_loginy .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)?

Adam Rosenfield avatar Jan 06 '09 10:01 Adam Rosenfield
Aceptado

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, .logino .profileo .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.

bashEsto complica esto porque solo .bashrclo 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_profileque también lean .bashrccon algo como

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

Otros shells se comportan de manera diferente; por ejemplo, with zsh, .zshrcsiempre 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.

.profilees 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á .profilesi existe uno.

Cos avatar Jan 06 '2009 04:01 Cos

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 INVOCATIONcapí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.

Johannes Schaub - litb avatar Jan 06 '2009 15:01 Johannes Schaub - litb

Clásicamente, ~/.profilelo utiliza Bourne Shell y probablemente Bash lo admita como medida heredada. Nuevamente, ~/.loginfueron ~/.cshrcutilizados por C Shell; no estoy seguro de que Bash los use en absoluto.

Se ~/.bash_profileusarí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 avatar Jan 06 '2009 04:01 Jonathan Leffler

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.

Filip Ekberg avatar Jan 06 '2009 04:01 Filip Ekberg

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.

Rose Perrone avatar Feb 27 '2012 00:02 Rose Perrone