¿Por qué ~ / .bash_profile no se obtiene al abrir una terminal?

138

Problema

Tengo una máquina virtual Ubuntu 11.04 y quería configurar mi entorno de desarrollo Java. Hice lo siguiente

  1. sudo apt-get install openjdk-6-jdk
  2. Agregó las siguientes entradas a ~ / .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
    
  3. Guarde los cambios y salga

  4. Abre una terminal nuevamente y escribe lo siguiente

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
    
  5. No pasó nada, como si la exportación de JAVA_HOME y su adición a la RUTA nunca hubieran terminado.

Solución

Tuve que ir a ~ / .bashrc y agregar la siguiente entrada hacia el final del archivo

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

Preguntas

  1. ¿Por qué tengo que hacer eso? Pensé que bash_profile, bash_login o perfil en ausencia de esos dos se ejecutan primero antes de bashrc.
  2. ¿Fue en este caso mi terminal un shell sin inicio de sesión ?
  3. Si es así, ¿por qué al hacer su después del terminal y poner la contraseña, no ejecutó el perfil donde también había configurado las exportaciones mencionadas anteriormente?
pregunta Viriato 11.04.2012 - 18:27

5 respuestas

182

~/.bash_profile solo proviene de bash cuando se inicia en modo de inicio de sesión interactivo. Eso es típicamente solo cuando inicia sesión en la consola ( Ctrl + Alt + F1 .. F6 ), o conectando a través de ssh.

Cuando inicia sesión gráficamente, ~/.profile se originará específicamente en la secuencia de comandos que inicia gnome-session (o en cualquier entorno de escritorio que esté utilizando). Por lo tanto, ~/.bash_profile no se obtiene cuando inicia sesión gráficamente.

Cuando abre un terminal, el terminal inicia el modo interactivo bash (sin inicio de sesión), lo que significa que generará ~/.bashrc .

El lugar correcto para poner estas variables de entorno es en ~/.profile , y el efecto debería aparecer la próxima vez que inicie sesión.

La fuente ~/.bash_profile de ~/.bashrc es la solución incorrecta. Se supone que es al revés; ~/.bash_profile debe fuente ~/.bashrc .

Consulte DotFiles para obtener una explicación más detallada, incluida una historia de por qué es así.

(En una nota al margen, al instalar openjdk a través de apt, los enlaces simbólicos deberían ser configurados por el paquete, para que realmente no necesites configurar JAVA_HOME o cambiar PATH )

    
respondido por el geirha 11.04.2012 - 18:41
40

Puede comprobar si su shell Bash se inicia como un shell de inicio de sesión ejecutando:

shopt login_shell

Si la respuesta es off , no está ejecutando un shell de inicio de sesión.

Lea la sección invocación del manual de Bash sobre cómo Bash lee (o no lee) diferentes archivos de configuración.

Extracto de man bash :

  

Cuando bash se invoca como un shell de inicio de sesión interactivo, o como un   shell no interactivo con la opción --login , primero lee   y ejecuta comandos desde el archivo /etc/profile , si ese archivo   existe Después de leer ese archivo, busca ~/.bash_profile ,    ~/.bash_login y ~/.profile , en ese orden, y lee y   ejecuta comandos desde el primero que existe y es legible.

su , por otro lado, tampoco inicia un shell de inicio de sesión de forma predeterminada, debe indicarle que lo haga utilizando la opción --login .

    
respondido por el lgarzo 11.04.2012 - 18:59
22

Creo que vale la pena mencionar que puede cambiar el valor predeterminado de gnome-terminal para usar un shell de inicio de sesión (es decir, bash -l) editando las preferencias de perfil.

ir a Editar - & gt; Preferencias de perfil - & gt; Pestaña Título y comando compruebe la opción "Ejecutar comando como un shell de inicio de sesión"

    
respondido por el kisoku 22.06.2013 - 02:23
13

Si abre un terminal o ejecuta su , el shell no se ejecuta como un shell de inicio de sesión sino como un shell interactivo normal. Entonces lee ~/.bashrc pero no ~/.bash_profile . Puede ejecutar su con la opción -l para que ejecute su shell como un shell de inicio de sesión.

Cuando trabajas con una GUI, el intérprete de comandos normalmente nunca se ejecuta como un intérprete de comandos de inicio de sesión, por lo que suele estar bien incluir todas las cosas en ~/.bashrc .

    
respondido por el Florian Diesch 11.04.2012 - 18:43
1

TL; DR

En la configuración de ubuntu clásica recomendada, ~/.bash_profile se evalúa solo en ocasiones específicas. Y tiene sentido.

Pon tus cosas en ~/.bashrc , se evaluará cada vez.

Ok, quiero entender, ¿por qué tiene sentido esto?

Puntos clave para entender lo que está sucediendo:

  • todos procesos en Linux tienen y usa variables de entorno
  • las variables de entorno son heredadas
  • configurándolos una vez en el padre de todo su proceso es suficiente (especialmente si requiere algún tiempo de cálculo).
  • el padre de todo su proceso normalmente se lanza después de usted inicie sesión en su dispositivo (proporcione sus credenciales).
  • hay cosas que quizás desee hacer solo una vez cuando inicie sesión en su computadora (compruebe si hay correo nuevo, por ejemplo ...).

El tiempo de "inicio de sesión" suele ser:

  • En modo consola, cuando inicia sesión (con Ctrl-Alt F1) o mediante ssh , como el caparazón será el padre de todo proceso, cargará su ~/.bash_profile .
  • En modo gráfico, cuando abre su sesión, el primer proceso ( gnome-session para ubuntu clásico) se encargará de leer
    .profile .

Ok, ¿dónde poner mis cosas?

Es bastante complejo, la historia completa está aquí . Pero aquí hay un descuido eso es bastante común para los usuarios de ubuntu. Entonces, teniendo en cuenta eso:

  • usas bash shell,
  • tiene un ~/.bash_profile y sigue la recomendación para agregar la carga de ~/.bashrc en su ~/.bash_profile para obtener al menos un archivo que se evalúa sea cual sea la invocación mecanismo .

Esta es una sugerencia rápida de dónde poner las cosas.

  • ~ / .bashrc (se evalúa en todas las ocasiones , siempre que siga la recomendación)

    Para la variable de entorno evaluación rápida y el código para su uso de línea de comandos solo para el usuario y bash-only (alias para ejemplo). bashismo son bienvenidos.

    Se carga en sí mismo en:

    • crea una nueva ventana / panel de shell en sesiones gráficas.
    • llamando a bash
    • screen nuevo panel o pestaña. (no tmux !)
    • cualquier instancia de bash en un cliente de consola gráfica ( terminator / gnome-terminal ...) si no marca opción "ejecutar comando como shell de inicio de sesión".

    Y se cargará en todas las otras ocasiones gracias a la recomendación previa.

  • ~ / .bash_profile (Obtiene solo en ocasiones específicas )

    Para la variable de entorno evaluación lenta y el código para sus procesos solo para el usuario y sesión de consola . bashismo son bienvenidos. Se carga en:

    • inicio de sesión de la consola (Ctrl-Alt F1),
    • ssh inicia sesión en esta máquina,
    • tmux panel o ventanas nuevos (configuración predeterminada), (no screen !)
    • llamadas explícitas de bash -l ,
    • cualquier instancia de bash en un cliente de consola gráfica ( terminator / gnome-terminal ...) solo si marcas opción "ejecutar comando como shell de inicio de sesión".
  • ~ / .profile (Se evalúa solo en la sesión gráfica)

    Para variables de entorno evaluación lenta y con no-bashismo para sus procesos solo para el usuario y todos los sesiones gráficas . Se pone cargado al iniciar sesión en su UI gráfica.

respondido por el vaab 08.03.2018 - 04:58

Lea otras preguntas en las etiquetas