Esta pregunta ya tiene una respuesta aquí:
- Diferencia entre .bashrc y .bash_profile 6 respuestas
Esto es embarazoso, pero después de muchos años de uso de sistemas POSIX tiempo completo, todavía tienen un tiempo difícil averiguar si una personalización de la cáscara debe ir en .bashrc
, .profile
o en otro lugar. Sin mencionar algunos de los archivos de configuración específicos del sistema operativo como .pam_environment
.
Sí, sé cómo descifrar la documentación y saber cuándo se carga o no cada archivo. Lo que me pregunto es si alguien ha reunido todas las pautas integrales sobre cómo decidir en qué archivo colocar un tipo determinado de personalización.
Respuestas:
TL; DR:
~/.bash_profile
debe ser súper simple y solo cargar.profile
y.bashrc
(en ese orden)~/.profile
tiene cosas que NO están específicamente relacionadas con bash, como variables de entorno (PATH
y amigos)~/.bashrc
tiene todo lo que quieras en una línea de comandos interactiva. Símbolo del sistema,EDITOR
variable, bash alias para mi usoAlgunas otras notas:
Cualquier cosa que deba estar disponible para aplicaciones gráficas O para sh (o bash invocado como
sh
) DEBE estar en~/.profile
~/.bashrc
no debe dar salida a nadaTodo lo que debe estar disponible solo para iniciar sesión en shells debe ir
~/.profile
Asegúrese de que
~/.bash_login
no exista.fuente
~/.profile
establecer correctamente el entorno para servicios como GDM / LightDM / LXDM que ejecutan explícitamente / bin / sh..bashrc
resultados son muchas cosas, ¿puedes comentar sobre eso? En particular, ¿dónde debo poner la salida de saludo?[[ $- == *i* ]]
, es decir, buscando 'i' en la$-
variable especial . Por supuesto, solo importa en primer lugar en los sistemas donde bash se compila para leer.bashrc
en modo no interactivo. (Es decir, Debian, pero no Arch.) Pero es una causa frecuente de misteriosos mensajes de error cuando intenta conectarse utilizandosftp
oscp
o herramientas similares..bash_profile
y.profile
. Pero bash solo lee el primero de cada tres. Es decir, si tiene una.bash_login
, entonces ambos.profile
y.bash_profile
será misteriosamente ignorado.En los últimos años, he tenido mucho tiempo que perder, así que he investigado esto durante un poco más de solo 10 minutos. No tengo idea si este es el mejor diseño, es solo uno que funciona correctamente en casi todos los casos.
Los requisitos:
~/.profile
debe ser compatible con cualquier / bin / sh: esto incluye bash, dash, ksh, cualquier otra cosa que una distribución pueda elegir usar.Las variables de entorno deben colocarse en un archivo que sea leído por los inicios de sesión de la consola (es decir, un shell de 'inicio de sesión') y los inicios de sesión gráficos (es decir, administradores de pantallas como GDM, LightDM o LXDM).
No tiene mucho sentido tener ambos
~/.profile
y~/.bash_profile
. Si falta el último, bash usará felizmente el primero, y cualquier línea específica de bash puede protegerse con un cheque para$BASH
o$BASH_VERSION
.La separación entre
*profile
y*rc
es que el primero se usa para shells de 'inicio de sesión', y el segundo cada vez que abre una ventana de terminal. Sin embargo, bash en el modo de 'inicio de sesión' no tiene origen~/.bashrc
, por lo tanto,~/.profile
debe hacerlo manualmente.La configuración más simple sería:
Tenga un
~/.profile
que establezca todas las variables de entorno (excepto las específicas de bash), tal vez imprima una o dos líneas, luego las fuentes~/.bashrc
si se ejecuta con bash, de lo contrario se adhiere a la sintaxis compatible con sh.Tenga un
~/.bashrc
dispositivo que realice cualquier configuración específica de shell, guardado con una comprobación de modo interactivo para evitar romper cosas comosftp
en Debian (donde bash se compila con la opción de cargar~/.bashrc
incluso para shells no interactivos):Sin embargo, también existe el problema de que ciertos comandos no interactivos (por ejemplo
ssh <host> ls
) se saltan~/.profile
, pero las variables de entorno serían muy útiles para ellos.Ciertas distribuciones (por ejemplo, Debian) compilan su bash con la opción de obtener
~/.bashrc
dichos inicios de sesión no interactivos. En este caso, he encontrado útil mover todas las variables de entorno (lasexport ...
líneas) a un archivo separado~/.environ
, y obtenerlo de ambos.profile
y.bashrc
, con una protección para evitar hacerlo dos veces:Desafortunadamente, para otras distribuciones (por ejemplo, Arch), no he encontrado una solución muy buena. Una posibilidad es usar el módulo PAM pam_env (habilitado por defecto), colocando lo siguiente en
~/.pam_environment
:Luego, por supuesto, actualizando
~/.environ
aunset BASH_ENV
.¿Conclusión? Las conchas son un dolor. Las variables de entorno son un dolor. Las opciones de tiempo de compilación específicas de la distribución son un dolor inmenso en el culo.
fuente
.profile
y.bashrc
de.bash_profile
y mantener.profile
limpio..profile
está limpio , gracias.~/.profile
y~/.bash_profile
": no estoy de acuerdo. Vea la respuesta de Dan para saber por qué..profile
y proteger lasbash
partes específicas con condicionales.Echa un vistazo a esta excelente publicación de blog de ShreevatsaR . Aquí hay un extracto, pero vaya a la publicación del blog, incluye una explicación de términos como "shell de inicio de sesión", un diagrama de flujo y una tabla similar para Zsh.
fuente
/etc/profile
llamadas/etc/bash.bashrc
y las~/.profile
llamadas~.bashrc
. De manera efectiva,/etc/bash.bashrc
y también~/.bashrc
se están ejecutando para inicios de sesión interactivos./bin/sh
BASH_ENV
). El párrafo relacionado de la página de manual de bash se puede encontrar buscandoIf bash is invoked with the name sh
.Te ofrezco mis pautas "integrales":
.bash_profile
y.profile
cargue.bashrc
si existe, por ejemplo, utilizando[ -r $HOME/.bashrc ] && source $HOME/.bashrc
.bashrc
.EDITAR: Se agregaron citas de miedo a "integral" por si alguien se siente tentado a creerlo. ;)
fuente
.bash_profile
y.profile
es un poco redundante; solo necesitas lo último. Sin embargo, debe hacerlo a prueba / bin / sh:if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi
ya que hay programas (a saber, gdm / lightdm) que obtienen el archivo manualmente de un script / bin / sh. Esto también significa que el entorno mantenido.bashrc
sería ineficaz. Tuve que -1, ya que sus pautas "integrales" no funcionarán en muchos sistemas, como lo descubrí por las malas varias veces.Dejé de tratar de resolver esto e hice un script (
~/.shell-setup
) que obtuve de todos los demás.Este enfoque requiere
~/.shell-setup
tener dos características:El n. ° 1 es bastante estándar, aunque quizás no se usa mucho en los scripts de shell.
# 2 es más complicado. Esto es lo que uso en bash:
Desafortunadamente, no recuerdo cómo se me ocurrió eso, o por qué no fue suficiente detectar un shell interactivo .
fuente
Ponga todo
.bashrc
y luego fuente.bashrc
de.profile
Desde la página de manual de bash (en OS X 10.9):
El texto anterior es la razón por la cual todo se coloca
.bashrc
. Sin embargo, hay un comportamiento un poco diferente cuando se trata de un shell de inicio de sesión. Nuevamente, citando la página del manual:.profile
se lee para shells de inicio de sesión, pero.bashrc
no lo es. Duplicar todo ese material.bashrc
es malo ™, por lo que debemos buscarlo para que.profile
el comportamiento permanezca constante.Sin embargo, no desea obtener
.bashrc
de forma.profile
incondicional. Consulte los comentarios y otras respuestas para obtener detalles adicionales.fuente
.bashrc
de.profile
. Ver la respuesta de @ DanRabinowitz.[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc
sería un dulce en línea para.profile
.