¿Por qué no funciona mi ~ / .bash_profile?


35

Estoy usando Linux Mint. Mi shell de inicio de sesión ( cat /etc/passwd | grep myUserName) es bash.

Después de iniciar mi entorno de escritorio gráfico y ejecutar un emulador de terminal desde él, puedo ver que .bash_profileno se obtiene (los valores del entorno que están exporteditados no están configurados). Pero si inicio sesión desde una consola de texto ( ctrl+ alt+ F1) o ejecuto manualmente bash -ldesde el emulador de terminal, .bash_profilefunciona bien.

¿Me equivoco cuando creo que .bash_profiledebe obtenerse cuando X comienza y todos exportlos vars ed deben estar disponibles en la terminal, desde X?

PD: colocar todo .bashrcy obtenerlo no .bash_profilees una buena idea ( https://stackoverflow.com/questions/902946/ ): las cosas del entorno deben obtenerse solo una vez.

Respuestas:


39

~/.bash_profileBash lee el archivo cuando se trata de un shell de inicio de sesión. Eso es lo que obtienes cuando inicias sesión en modo texto.

Cuando inicia sesión en X, los scripts de inicio son ejecutados por /bin/sh. En Ubuntu y Mint, /bin/shes guión , no bash. Dash y bash tienen las mismas características principales, pero el tablero se adhiere a estas características principales para ser rápido y pequeño, mientras que bash agrega muchas características a costa de requerir más recursos. Es común usar dash para scripts que no necesitan las características adicionales y bash para uso interactivo (aunque zsh tiene muchas características más agradables ).

La mayoría de las combinaciones de gestor de pantalla (el programa donde se escribe el nombre de usuario y contraseña) y el entorno de escritorio lectura ~/.profilede los guiones de entrada en /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessiono lo que sea aplicable. Así que pon tus definiciones de variables de entorno ~/.profile. Asegúrese de utilizar solo la sintaxis que admite el tablero.

Entonces, ¿qué deberías poner dónde?

  • Un buen .bash_profilecarga .profile, y carga .bashrcsi el shell es interactivo.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • En .profile, coloque definiciones de variables de entorno y otras configuraciones de sesión como ulimit.

  • En .bashrc, coloque la configuración interactiva de bash como alias, funciones, finalización, combinaciones de teclas (que no están en .inputrc), ...

Consulte también ¿ Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión? y alternativa a .bashrc .


1
muchas cosas aprendidas de una sola respuesta :)
mtk

16

.bash_profilees el script de configuración de inicio de bash. No existe una norma que ordene X a la fuente.bash_profile .

Lo que estás pensando es más bien .profile . Originalmente era el archivo de configuración de inicio del shell bourne (sh). Hoy en día, muchas distribuciones tienen su entorno de escritorio configurado en origen .profile. Tenga en cuenta que esto tampoco es un estándar, pero parece ser una convención.

Debian solía buscar .profileen el inicio de sesión gráfico ( página wiki a partir de 2013 ) ahora no lo hace ( página wiki a partir de 2016 ).

Fuentes de arco .xprofileen el inicio de sesión gráfico ( página wiki a partir de 2013 ).

Ubuntu solía desalentar el uso .profile( página wiki a partir de 2013 ) ahora ya no lo desalienta ( página wiki a partir de 2016 ).


Con respecto a su otra pregunta: ¿Por qué no funciona mi ~ / .bash_profile? 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

Para obtener más detalles, vea mi respuesta a una pregunta similar en askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319


1
Algo de esto es correcto, pero "leer siempre ~/.bashrc" es un mal consejo: solo.bashrc debe leer desde un shell interactivo . Se ha perdido el problema principal aquí, que es que al iniciar sesión en X, no hay una instancia de inicio de sesión de bash (en la mayoría de las combinaciones de entorno de escritorio / administrador de pantalla, incluidas evidentemente las de AntonioK).
Gilles 'SO- deja de ser malvado'

Gracias por tus comentarios. Espero haber actualizado mi respuesta lo suficientemente bien como para resolver sus quejas. Con respecto a mi consejo de "leer siempre .bashrc", quise decir siempre para un shell interactivo. He aclarado esa parte. Espero que ya no sea engañoso.
lesmana

2
" Ubuntu desalienta específicamente el uso .profile( enlace ) " La wiki una vez (absurdamente) desanimó eso; Eso ha sido arreglado. (La nota /etc/profileno se recomienda para las tareas de todo el sistema, en lugar de agregar scripts a/etc/profile.d.profile recomienda ). Los archivos por usuario ahora se presentan como una de las formas recomendadas para establecer variables de entorno por usuario: "Archivos adecuados para configuraciones de variables de entorno que deberían afectar solo a usuarios particulares (en lugar del sistema en su conjunto) son ~ / .pam_environment y ~ / .profile ".
Eliah Kagan

La página vinculada sobre Debian especifica que Debian hace no lee ~/.profilepara el inicio de sesión gráfico y ~/.xsessionrcdebe usarse en su lugar.
karora

Gracias por notarlo. la página wiki se actualizó. Me vinculé a las versiones tal como estaban en el momento de la respuesta.
lesmana

2

En su pregunta, se refiere a https://stackoverflow.com/questions/902946/ como se recomienda no fuente, cuando la respuesta aceptada prescribe

  • Pongo mi configuración PATH en un archivo .profile (porque a veces uso otros shells)
  • Poner mis alias y funciones de Bash en mi archivo .bashrc
  • Luego use esto [EDITADO: snip code-comments]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Ponerlo todo .profileno funcionó para mí en Linux Mint. El uso .bashrcfuncionó bien.


2

Surgen un par de problemas al intentar recargar / source ~ / .profile file. [Esto se refiere a Ubuntu Linux - en algunos casos los detalles de los comandos serán diferentes]

  1. ¿Está ejecutando esto directamente en la terminal o en un script?
  2. ¿Cómo ejecutas esto en un script?

Anuncio. 1)

Ejecutar esto directamente en la terminal significa que no se creará ningún subshell. Entonces puede usar cualquiera de los dos comandos:

source ~/.bash_profile

o

. ~/.bash_profile

En ambos casos, esto actualizará el entorno con el contenido del archivo .profile.

Anuncio 2) Puede iniciar cualquier script bash llamando

sh myscript.sh 

o

. myscript.sh

En el primer caso, esto creará una subshell que no afectará las variables de entorno de su sistema y serán visibles solo para el proceso de la subshell. Después de finalizar el comando subshell, no se aplicará ninguna de las exportaciones, etc. ESTE ES UN ERROR COMÚN Y CAUSA A MUCHOS DESARROLLADORES PARA PERDER MUCHO TIEMPO.

Para que sus cambios aplicados en su script tengan efecto en el entorno global, el script debe ejecutarse con

.myscript.sh

mando.

Para asegurarse de que su script no se ejecute en un subshel, puede usar esta función. (De nuevo, el ejemplo es para el shell de Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

¡Espero que esto aclare algunos de los malentendidos comunes! : D ¡Buena suerte!


0

La solución simple es hacer que el terminal sea un terminal de inicio de sesión. Para el terminal Gnome en 'Tile and Command' del perfil predeterminado, puede marcar la casilla "Ejecutar comando como un shell de inicio de sesión". Este artículo explica la diferencia entre un shell de inicio de sesión y uno que no lo es.

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.