Estoy usando Linux Mint. Mi shell de inicio de sesión (cat /etc/passwd | grep myUserName
) es bash.
Después de iniciar mi entorno gráfico de escritorio y ejecutar un emulador de terminal desde él, puedo ver que .bash_profile
no tiene origen (variables de entorno que son export
ed en él no están configurados). Pero si inicio sesión desde una consola de texto ( ctrl + alt + F1 ) o ejecuto manualmente bash -l
del emulador de terminal, .bash_profile
funciona bien.
¿Me equivoco cuando pienso que .bash_profile
debería obtenerse cuando X se inicia y todas las export
«ed vars deberían estar disponibles en la terminal, desde X?
PS Colocar todo en .bashrc
y obtenerlo de .bash_profile
no es una buena idea ( https://stackoverflow.com/questions/902946/ ): las cosas del entorno deben obtenerse solo una vez.
Respuesta
El archivo ~/.bash_profile
es leído por bash cuando es un shell de inicio de sesión. Eso es lo que obtienes cuando inicias sesión en modo texto.
Cuando inicias sesión en X, /bin/sh
ejecuta las secuencias de comandos de inicio. En Ubuntu y Mint, /bin/sh
es dash , no bash. Dash y bash tienen las mismas funciones principales, pero dash 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 características adicionales y bash para uso interactivo (aunque zsh tiene muchas funciones más agradables ).
La mayoría de las combinaciones de visualización administrador (el programa en el que escribe su nombre de usuario y contraseña) y el entorno de escritorio lee ~/.profile
de las secuencias de comandos de inicio de sesión en /etc/X11/Xsession
, /usr/bin/lightdm-session
, /etc/gdm/Xsession
o lo que corresponda. Así que ponga las definiciones de las variables de entorno en ~/.profile
. Asegúrese de utilizar solo la sintaxis que admita el guión.
Entonces, ¿qué debería poner dónde?
-
Un buen
.bash_profile
carga.profile
y carga.bashrc
si el shell es interactivo.. ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi
-
En
.profile
, coloque definiciones de variables de entorno y otras configuraciones de sesión comoulimit
. - 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 .
Comentarios
- muchas cosas aprendidas de una sola respuesta: )
- incluso .profile no ‘ t funciona en Debian 10 » Buster «, solo .bashrc wor ks
Answer
.bash_profile
es el script de configuración de inicio de intento. No existe un estándar que exija X a la fuente .bash_profile
.
Lo que está pensando es más bien .profile
. Originalmente era el archivo de configuración de inicio del bourne shell (sh). Hoy en día, muchas distribuciones tienen su entorno de escritorio configurado como fuente .profile
. Tenga en cuenta que esto tampoco es un estándar, pero parece ser una convención.
Debian solía obtener .profile
en el inicio de sesión gráfico ( página wiki a partir de 2013 ) ahora no» t ( página wiki a partir de 2016 ).
Arch sources .xprofile
en el inicio de sesión gráfico ( página wiki a partir de 2013 ).
Ubuntu solía desalentar el uso de .profile
( página wiki a partir de 2013 ) ahora ya no lo desanima ( página wiki de 2016 ).
Con respecto a su otra pregunta: ¿Por qué no funciona mi ~ / .bash_profile? Esa es la 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, consulte mi respuesta a un simil pregunta de ar en askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319
Comentarios
- Algo de esto es correcto, pero“ leer siempre
~/.bashrc
”es un mal consejo: debes solo leer.bashrc
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, incluido evidentemente AntonioK ‘ s). - Gracias por sus 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. - » Ubuntu desalienta específicamente el uso de
.profile
( enlace ) » La wiki una vez (absurdamente) desalentó eso; que ‘ se ha solucionado. (Tenga en cuenta que/etc/profile
sigue desaconsejado para las asignaciones de todo el sistema, en lugar de agregar secuencias de comandos a/etc/profile.d
). Por usuario ahora se presentan como una de las formas recomendadas de establecer variables de entorno por usuario: » Archivos adecuados para la configuración de variables de entorno que deberían afectar solo a un usuario en particular ( en lugar del sistema en su conjunto) son ~ / .pam_environment y ~ / .profile . » - La página vinculada sobre Debian especifica que Debian no lee
~/.profile
para el inicio de sesión gráfico y~/.xsessionrc
debe ser usado en su lugar. - gracias por notarlo. la página wiki se actualizó. Me vinculé a las versiones tal como estaban en el momento de la respuesta.
Respuesta
Surgen un par de problemas cuando intentando volver a cargar el archivo / source ~ / .profile. [Esto se refiere a Ubuntu linux – en algunos casos los detalles de los comandos serán diferentes]
- ¿Está ejecutando esto directamente en la terminal o en un script?
- ¿Cómo ejecuta esto en una secuencia de comandos?
Anuncio. 1)
Ejecutar esto directamente en la terminal significa que no se creará ninguna subcapa. Por lo tanto, puede utilizar 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 subcapa que no afectará las variables de entorno de su sistema y serán visibles solo para el proceso de subcapa. Después de finalizar el comando subshell, no se aplicará ninguna de las exportaciones, etc. ESTE ES UN ERROR COMÚN Y CAUSA QUE MUCHOS DESARROLLADORES PIERDAN MUCHO TIEMPO.
Para que los cambios aplicados en su secuencia de comandos tengan efecto para el entorno global, la secuencia de comandos debe ejecutarse con el comando
.myscript.sh
.
Para asegurarse de que su secuencia de comandos no se ejecuta en un subshel puede utilizar 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!
Respuesta
En su pregunta, se refiere a https://stackoverflow.com/questions/902946/ como recomendando no buscar, cuando la respuesta aceptada prescribe
- Ponga mi configuración PATH en un archivo .profile (porque a veces uso otros shells)
- Ponga mis alias y funciones de Bash en my. archivo bashrc
Luego use este [EDITADO: código de recorte-comentarios]:
.bash_profile
:#!/bin/bash # echo "Loading ${HOME}/.bash_profile" source ~/.profile # Get the paths source ~/.bashrc # get aliases
Poniéndolo todo en .profile
sí no me funciona en Linux Mint. Usar .bashrc
funcionó bien.
Respuesta
La solución simple es hacer terminal una terminal de inicio de sesión. Para la terminal Gnome, en «Mosaico y comando» del perfil predeterminado, puede marcar la casilla «Ejecutar comando como 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.