Pregunta

He usado varios sistemas diferentes basados ??en * nix 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é secuencia de comandos de inicio es el lugar adecuado 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 siempre relevantes? ¿Cuáles son las diferencias entre 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 las plataformas (incluido Mac OS X (y su Terminal.app) y Cygwin Bash)?

¿Fue útil?

Solución

La principal diferencia con los archivos de configuración de shell es que algunos solo se leen mediante "iniciar sesión" shells (p. ej., 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, digamos, .login o .profile o .zlogin (dependiendo del shell que esté usando).

Entonces tiene archivos de configuración que son leídos por "interactivo" shells (como en, unos 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 , < código> .tcshrc , .zshrc , etc.

bash complica esto ya que .bashrc se solo lee 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 diciendo a su .bash_profile que también lea .bashrc con algo como

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

Otros shells se comportan de manera diferente, por ejemplo, con zsh , .zshrc siempre se lee para un shell interactivo, ya sea que se trate de un 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 las máquinas.

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

Otros consejos

Eso es 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 cuando simplemente se inicia xterm, por ejemplo). Hay otras formas de iniciar sesión. Por ejemplo, utilizando un administrador de pantalla X. Estos 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. & Quot; , creo que es un spot-on :) Explica qué es un " interactivo " la cáscara es demasiado.

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, ~ / .profile es usado por Bourne Shell, y probablemente Bash lo respalde 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ía 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 la sobrecarga cuando se inicia un shell de no 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 resumir:

  

.bash_profile se ejecuta cuando   iniciar sesión. Cosas que pones allí podrían ser   tu PATH y otros importantes   variables de entorno.

     

.bashrc se utiliza para shells sin inicio de sesión.   No estoy seguro de lo que eso significa. Lo sé   que RedHat   lo ejecuta cada vez que empiezas   otro shell (su a este usuario o   simplemente llamando a bash otra vez)   Quiero poner alias allí pero de nuevo   No estoy seguro de qué significa eso. yo   simplemente ignóralo yo mismo.

     

.profile es el equivalente de   .bash_profile para la raíz. Yo creo que   El nombre se cambia para permitir que otros   los shells (csh, sh, tcsh) también lo usan.   (no necesitas uno como usuario)

     

También hay .bash_logout que   se ejecuta en, sí, bueno supongo ... cerrar sesión.   Es posible que desee dejar de demonios o incluso   hacer un poco de limpieza Usted puede   también agrega " borrar " allí si quieres   Borra la pantalla cuando te desconectes.

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

Probablemente sean dependientes de la distribución, no todas las distribuciones optan por 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 , el 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.

Recomienda:

  

La mayoría de las veces no desea mantener dos archivos de configuración por separado.   para shells de inicio de sesión y no de inicio de sesión & # 8212; cuando estableces una RUTA, quieres que   aplicar a ambos. Puedes arreglar esto comprando .bashrc desde tu   .bash_profile file, 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   Se llamará la máquina desde una consola .bashrc.

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top