Configure gnome-terminal para iniciar bash como un shell de inicio de sesión, no lee .bashrc


24

Estoy tratando de integrar RVM con gnome-terminal .

Por defecto, gnome-terminal no inicia bash como un shell de inicio de sesión. Lo habilité run command as a login shellcomo se sugiere en esta respuesta sobre el mismo tema que configura RVM, pero cuando hago esto, el .bashrcarchivo no se lee.

Por ejemplo, creo una variable de entorno .bashrcy, cuando inicio un nuevo terminal gnome, no puedo leerlo. Necesito ejecutar explícitamente source .bashrcpara leer el archivo.

¿Es este el comportamiento esperado?

Respuestas:


38

Sí, ese es el comportamiento esperado.

El comportamiento, en resumen, es el siguiente:

  • bash comenzó como un shell de inicio de sesión interactivo: lee ~/.profile
  • bash comenzó como un shell interactivo sin inicio de sesión: lee ~/.bashrc

Lea el manual de bash sobre los archivos de inicio para obtener más detalles.

Personalmente, creo que este comportamiento es extraño y aún no he encontrado una racionalización para esta decisión de diseño.


Alguna explicación de la terminología:

  • Un shell interactivo es un shell con el que puede interactuar, lo que significa que puede escribir comandos en él. La mayoría de los shells que usará son shells interactivos.
  • Un shell no interactivo es un shell con el que no puede interactuar. Los scripts de shell se ejecutan dentro de shells no interactivos.
  • Un shell de inicio de sesión es el shell que se inicia cuando inicia sesión en su sistema.
  • Un shell sin inicio de sesión es un shell que se inicia después del proceso de inicio de sesión.

La mayoría de los shells que ves son shells interactivos sin inicio de sesión . Esto es especialmente cierto si está ejecutando un entorno gráfico como gnome, porque entonces gnome es el "shell de inicio de sesión". Cualquier sesión bash iniciada dentro de gnome es un shell sin inicio de sesión. Si desea ver un shell de inicio de sesión interactivo real, vaya a una consola virtual (usando Ctrl+Alt+F1) y luego inicie sesión con su nombre de usuario y contraseña. Ese es un verdadero shell de inicio de sesión interactivo. Puede volver al shell gráfico usando Ctrl+Alt+F7.

Hay una opción --loginque hará que bash se comporte como si fuera un shell de inicio de sesión, incluso si se inicia después de haber iniciado sesión. Configurar gnome-terminal para iniciar bash como shell de inicio de sesión significa que comenzará bash utilizando la --loginopción.


Por lo general, desea que bash siempre lea ~/.bashrcen un shell interactivo. Así es como recomiendo hacer eso:

Crea un ~/.bash_profilearchivo. Si bash se inicia como un shell de inicio de sesión, primero buscará ~/.bash_profileantes de buscar ~/.profile. Si bash encuentra, ~/.bash_profileentonces no leerá ~/.profile.

Pon las siguientes líneas en ~/.bash_profile:

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"

Ahora, si bash se inicia como un shell de inicio de sesión interactivo, leerá los siguientes archivos:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

y si bash se inicia como un shell interactivo sin inicio de sesión:

  1. ~/.bashrc

Debes poner cosas que sean específicas de bash ~/.bashrcy cosas que no sean específicas de bash ~/.profile. Por ejemplo PATHentra ~/.profiley HISTCONTROLentra ~/.bashrc.

Tenga en cuenta que ~/.profileno es bash específico. También se leen otros shells basados ​​en texto (por ejemplo sh o ksh) y shells gráficos (gnome) ~/.profile. Es por eso que no debes poner cosas específicas de bash ~/.profile.


1
+1. Gracias, esto me estaba volviendo
loco

1
mywiki.wooledge.org/DotFiles explica algunos antecedentes de por qué es así. Sin embargo, la razón principal de este problema con rvm es que rvm pone el código, que debe estar en ~/.bashrcprimer lugar, en el perfil. La falla está en rvm.
geirha

Según @geirha que deberían haber usado~/.profile
sanmai

La razón es que el script de perfil puede controlar la evaluación de lo .bashrcrelativo a lo que necesita hacer. Si el shell interactivo siempre lee, ¿ .bashrcdebería ser antes o después .profile? ¿Qué sucede si desea configurar algunas cosas en las .bashrcque se .profileda por sentado? ¿Y al mismo tiempo quieres que algunas cosas .bashrcdependan de algo creado por .profile? Ninguna orden de carga satisfará ambos escenarios.
Kaz

11

Esta no es una mala decisión de diseño, ni un error, ni un comportamiento esperado de proyectiles y terminales

Es simplemente un valor predeterminado desafortunado de una opción de configuración por perfil en Gnome Terminal, que puede solucionar fácilmente.

  1. Vaya a Editar -> Preferencias de perfil .

  2. Seleccione la pestaña Título y Comando .

  3. ¡Observe cómo la casilla de verificación Ejecutar comando como shell de inicio de sesión no está marcada! Revisalo.

Eso es. Si hace esto al Defaultperfil, o al perfil que esté configurado para usarse al hacer nuevas terminales, obtendrá un shell de inicio de sesión.

Supongo que debajo del capó, esta opción probablemente hace que pase la -lopción al shell.


0

Tuve la misma pregunta y encontré una solución: ¡simplemente use SSH para un shell de inicio de sesión real!

1. Como superusuario, cree un usuario del sistema rvm dedicado para un aislamiento completo y asigne una contraseña:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Instale dependencias para que rvm pueda construir rubíes sin solicitar la contraseña de superusuario:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH en localhost para un shell de inicio de sesión real (puede que tenga que hacerlo apt-get install ssh)

ssh rvmuser@localhost

4. Instalar rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Cierre sesión y vuelva a iniciarla para que se carguen todas las funciones de rvm

exit

ssh rvmuser@localhost

6. Use rvm :)


0

Es común cuando se usa bash para colocar la inicialización del perfil .bash_profile, que se lee solo por bash al iniciar sesión, mientras que otros shells se han compartido históricamente .profile. Esto le permite colocar comandos específicos de bash .bash_profile.

El uso de lo siguiente se hace comúnmente para extraer los alias que se definen en .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.