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, .profileo 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_profiledebe ser súper simple y solo cargar.profiley.bashrc(en ese orden)~/.profiletiene cosas que NO están específicamente relacionadas con bash, como variables de entorno (PATHy amigos)~/.bashrctiene todo lo que quieras en una línea de comandos interactiva. Símbolo del sistema,EDITORvariable, 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~/.bashrcno debe dar salida a nadaTodo lo que debe estar disponible solo para iniciar sesión en shells debe ir
~/.profileAsegúrese de que
~/.bash_loginno exista.fuente
~/.profileestablecer correctamente el entorno para servicios como GDM / LightDM / LXDM que ejecutan explícitamente / bin / sh..bashrcresultados 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.bashrcen modo no interactivo. (Es decir, Debian, pero no Arch.) Pero es una causa frecuente de misteriosos mensajes de error cuando intenta conectarse utilizandosftposcpo herramientas similares..bash_profiley.profile. Pero bash solo lee el primero de cada tres. Es decir, si tiene una.bash_login, entonces ambos.profiley.bash_profileserá 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:
~/.profiledebe 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
~/.profiley~/.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$BASHo$BASH_VERSION.La separación entre
*profiley*rces 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,~/.profiledebe hacerlo manualmente.La configuración más simple sería:
Tenga un
~/.profileque establezca todas las variables de entorno (excepto las específicas de bash), tal vez imprima una o dos líneas, luego las fuentes~/.bashrcsi se ejecuta con bash, de lo contrario se adhiere a la sintaxis compatible con sh.export TZ = "Europa / París" export EDITOR = "vim" si ["$ BASH"]; entonces . ~ / .bashrc fi tiempo de actividadTenga un
~/.bashrcdispositivo que realice cualquier configuración específica de shell, guardado con una comprobación de modo interactivo para evitar romper cosas comosftpen Debian (donde bash se compila con la opción de cargar~/.bashrcincluso para shells no interactivos):[[$ - == * i *]] || volver 0 PS1 = '\ h \ w \ $' start () {sudo service "$ 1" start; }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
~/.bashrcdichos 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.profiley.bashrc, con una protección para evitar hacerlo dos veces:Si ! ["$ PREFIJO"]; a continuación, # o $ EDITOR, o $ TZ, o ... . ~ / .environ # generalmente cualquier variable que .environ configuraría fiDesafortunadamente, 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
~/.environaunset 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
.profiley.bashrcde.bash_profiley mantener.profilelimpio..profileestá limpio , gracias.~/.profiley~/.bash_profile": no estoy de acuerdo. Vea la respuesta de Dan para saber por qué..profiley proteger lasbashpartes 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/profilellamadas/etc/bash.bashrcy las~/.profilellamadas~.bashrc. De manera efectiva,/etc/bash.bashrcy también~/.bashrcse están ejecutando para inicios de sesión interactivos./bin/shBASH_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_profiley.profilecargue.bashrcsi 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_profiley.profilees un poco redundante; solo necesitas lo último. Sin embargo, debe hacerlo a prueba / bin / sh:if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fiya 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.bashrcserí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-setuptener 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
.bashrcy luego fuente.bashrcde.profileDesde 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:.profilese lee para shells de inicio de sesión, pero.bashrcno lo es. Duplicar todo ese material.bashrces malo ™, por lo que debemos buscarlo para que.profileel comportamiento permanezca constante.Sin embargo, no desea obtener
.bashrcde forma.profileincondicional. Consulte los comentarios y otras respuestas para obtener detalles adicionales.fuente
.bashrcde.profile. Ver la respuesta de @ DanRabinowitz.[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrcsería un dulce en línea para.profile.