/ etc / perfil no se obtiene

45

Para el 11.04, hice una nueva instalación de mi sistema. Parte de que se instalan fue instalar RVM , que se pega una rvm.shen /etc/profile.d/. Esto no funciona ya /etc/profileque (que carga cada + r /etc/profile.d/*.sh) no se está cargando. Según la documentación, el perfil solo se obtiene si bash se ejecuta al iniciar sesión. Para verificar esto, invoqué bash --login, después de lo cual rvmestaba disponible.

Esto me ha funcionado en versiones anteriores de Ubuntu sin ninguna configuración. Es decir, una nueva instalación de 10.10 generará correctamente el perfil / .d.

Mi pregunta es: ¿hay algo que esté haciendo mal o hay algunas suposiciones nuevas en Natty que han roto esto? Mi solución actual es source /etc/profilein ~/.bashrc(que es horrible ya que el perfil debe cargarse antes que bashrc, pero funciona).

Bagazo
fuente

Respuestas:

52

Por defecto, gnome-terminal no inicia bash como un shell de inicio de sesión (supongo que quiere decir que bash comenzó dentro de un gnome-terminal). Eso significa que bash no leerá /etc/profileo ~/.profile. Como has observado correctamente, bash leerá esos archivos si se inicia como un shell de inicio de sesión.

La solución rápida a su problema es configurar gnome-terminal para iniciar bash como un shell de inicio de sesión para que se lea /etc/profile. Para ello, debe habilitar "Ejecutar comando como un shell de inicio de sesión" en el gnome-terminal "Preferencias de perfil" accesible desde el menú Editar.

No recomiendo hacer esto porque desordena la distinción entre ~/.profiley ~/.bashrc. Idealmente, ~/.profiledebe hacer cosas que se requieren solo una vez, durante el inicio de sesión, mientras que ~/.bashrcdebe hacer cosas que se requieren cada vez que se inicia bash.

Hay una pregunta y una respuesta en el superusuario que habla sobre la diferencia entre bashrc y perfil . Lea allí para más información.

Según la descripción del problema, parece que el script rvm necesita cargarse solo una vez, durante el inicio de sesión. Hasta donde yo sé, Ubuntu ha configurado el inicio de sesión gráfico para leer /etc/profile/y ~/.profile. Eso significa que, después de cerrar sesión e iniciar sesión una vez, el script rvm debe estar activo. Si aún no funciona, entonces quizás el script rvm necesite cargarse para cada sesión bash. Si ese es el caso, entonces bashrces el lugar más apropiado para el script.

lesmana
fuente
Establecer 'ejecutar comando como un shell de inicio de sesión' efectivamente se cargó /etc/profile(y, por lo tanto, el .d). Gracias por la explicación, parece que esto requiere un seguimiento con la gente rvm.
Marc
77
Ubuntu 11.04 no parece leer /etc/profiley ~/.profiledurante el inicio de sesión. Es extraño porque siempre funcionó con versiones anteriores. Creo que esto no es una solución, sino una solución alternativa.
Luca
2
@lesmana ¿Hay alguna forma de habilitar "Ejecutar comando como un shell de inicio de sesión" desde la CLI en lugar de la GUI? Estoy en un servidor remoto y no puedo reenviar X localmente.
Waseem
5

Sin embargo, hay un archivo /etc/bash.bashrc que es leído por gnome-terminal y es el "archivo .bashrc de todo el sistema para shells interactivos bash (1)".

Mi llamada a la función rvm [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"entró allí y funciona bien para la pareja de usuarios en ese sistema.

Dmitri
fuente
gnome-terminal no hace nada por el estilo. gnome-terminal ejecuta bash (o lo que sea que su shell de inicio de sesión esté configurado en la base de datos passwd) en modo interactivo, y bash comenzó a leer de forma interactiva /etc/bash.bashrc. Bueno, al menos en Debian / Ubuntu. Bash normalmente no lee un bashrc de todo el sistema; Debian lo ha parchado para hacerlo.
geirha
@geirha: dmitri @ Eos: ~ $ uname -a Linux Eos 3.0.0-16-generic # 29-Ubuntu SMP martes 14 de febrero 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos: ~ $ cat / etc / bash.bashrc # Archivo .bashrc de todo el sistema para shells bash (1) interactivos. # Para habilitar también la configuración / comandos en este archivo para shells de inicio de sesión, # este archivo debe obtenerse en / etc / profile. # Si no se ejecuta de forma interactiva, no haga nada [-z "$ PS1"] && return .....
Dmitri
2
Sí, obviamente, gnome-terminal invoca a bash para leer ese archivo: si su shell es ksh, entonces gnome-terminal no leería ese archivo, ¿verdad? ¿Puedo sugerir buscar la palabra "pedante" en el diccionario antes de continuar usando frases provocativas como "no hace nada por el estilo".
Dmitri
4

La instalación de RVM como multiusuario requiere que el usuario ejecute este comando:

(porque Ubuntu no obtiene /etc/profile.d al iniciar sesión)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc
usuario50486
fuente
3
Ubuntu genera los archivos /etc/profile.d/durante el inicio de sesión porque el /etc/profilebucle predeterminado recorre y genera los archivos /etc/profile.d/. Sin embargo, si esto rvm.shcontiene código para shells interactivos, como funciones o alias, no tiene /etc/profilesentido obtenerlos. La configuración para las sesiones de bash interactivas debe estar en .bashrc.
geirha
0

si tiene ZSH u OH-MY-ZSH, su perfil es / etc / zprofile

Hadi Farnoud
fuente
0

De hecho, he encontrado para aquellos a quienes no les gusta reiniciar completamente sus cajas a menos que sea absolutamente necesario lo siguiente ...

No necesita reiniciar toda la máquina para que los cambios /etc/profilesurtan efecto. Todo lo que necesita es reiniciar la GUI del escritorio XWindows para que vuelva a leer las configuraciones (como lo haría si se iniciara como parte de un reinicio en todo el sistema).

Para mí, uso xUbuntu, que usa LightDM, pero puede usar cualquier archivo ejecutable que llame a su escritorio actual.

Primero, no puede usar un emulador de terminal desde el interior de la GUI del escritorio para hacerlo (al menos no con LightDM), necesita usar SSH o una consola secundaria (si mantiene presionadas las teclas Ctrl + Alt y pulsa una tecla F o una tecla numérica) debe abandonar su pantalla o inicio de sesión de escritorio gráfico en una ventana de terminal simple). También le sugiero que cierre todas las cosas de escritorio remoto como VNC si está utilizando SSH (obviamente, SSH se puede conectar, simplemente no desea que una ventana abierta de VNC se muestre en la pantalla 0 mientras intenta reiniciarse, ya que esto puede bloquear el reinicio mientras espera a que finalice la sesión de VNC).

Hago esto todo el tiempo con SSH y es un gran salvavidas, especialmente cuando no está físicamente cerca de su máquina y no tiene ganas de esperar un reinicio completo y volver a conectar :-D

Ahora, la parte fácil una vez en un terminal "secundario" o un problema de SSH: (Sí, esto matará su sesión actual, asegúrese de que no le importe, guarde los documentos abiertos o trabaje)

sudo service lightdm restart

espere un minuto mientras mata el escritorio y luego lo inicia nuevamente (esto puede tomar unos buenos segundos ya que las cosas se detienen y luego se ejecutan nuevamente al inicio)

Eso es todo, ahora cuando regrese a la consola 0 o vaya a usar VNC para conectarse nuevamente, será recibido por el indicador de inicio de sesión e iniciará sesión de manera normal y si abre un emulador de terminal y va a emitir su comando, ahora debería no tiene problemas ya que todo se volvió a encontrar como si hiciera un reinicio completo de la máquina.

Solo recuerde, si emite sudo service lightdm restart[o stop, startlo que sea] desde el entorno de escritorio en sí usando un emulador de terminal, el comando simplemente se quedará allí y nada parecerá que suceda. Esto se debe a que actualmente está usando esa consola (también conocida como pantalla) 0 y, por lo tanto, no puede bajar completamente y volver a subir ya que está esperando que el escritorio no esté en uso antes de ejecutar el comando.

Última nota: no he intentado emitir un reinicio en el entorno desde el escritorio en un emulador de terminal y luego cambiar a otra consola que pueda reiniciarlo, pero si ya va a cambiar la consola, ¿por qué no simplemente ejecuta el comando? a partir de ahí como debería ser de todos modos?

Paria
fuente
-4

echo ". .profile" >> ~ / .bashrc

Y luego abra otra ventana. Creo que este es el enfoque fácil.

Chris
fuente
1
Desde las .profilefuentes predeterminadas .bashrc, esto resultaría en un bucle para la mayoría de los usuarios.
muru