¿Cuál es la diferencia entre .bashrc
y .bash_profile
y cuál debería usar?
bash
bashrc
.bash-profile
cfischer
fuente
fuente
.profile
, eche un vistazo a esta pregunta: superuser.com/questions/789448/…Respuestas:
Tradicionalmente, cuando inicia sesión en un sistema Unix, el sistema iniciaría un programa para usted. Ese programa es un shell, es decir, un programa diseñado para iniciar otros programas. Es un shell de línea de comando: inicia otro programa escribiendo su nombre. El shell predeterminado, un shell Bourne, lee los comandos
~/.profile
cuando se invoca como el shell de inicio de sesión.Bash es un caparazón tipo Bourne. Lee los comandos de
~/.bash_profile
cuando se invoca como el shell de inicio de sesión, y si ese archivo no existe¹, intenta leer en su~/.profile
lugar.Puede invocar un shell directamente en cualquier momento, por ejemplo, iniciando un emulador de terminal dentro de un entorno GUI. Si el shell no es un shell de inicio de sesión, no se lee
~/.profile
. Cuando comienza bash como un shell interactivo (es decir, no para ejecutar un script), se lee~/.bashrc
(excepto cuando se invoca como un shell de inicio de sesión, luego solo se lee~/.bash_profile
o~/.profile
.Por lo tanto:
~/.profile
es el lugar para colocar cosas que se aplican a toda su sesión, como los programas que desea iniciar cuando inicia sesión (pero no los programas gráficos, van a un archivo diferente) y las definiciones de variables de entorno.~/.bashrc
es el lugar para colocar cosas que se aplican solo a bash en sí, como alias y definiciones de funciones, opciones de shell y configuraciones de solicitud. (También puedes poner atajos de teclado allí, pero para bash normalmente entran~/.inputrc
).~/.bash_profile
se puede usar en lugar de~/.profile
, pero se lee solo por bash, no por cualquier otro shell. (Esto es principalmente una preocupación si desea que sus archivos de inicialización funcionen en varias máquinas y su shell de inicio de sesión no es un bash en todas ellas). Este es un lugar lógico para incluir~/.bashrc
si el shell es interactivo. Recomiendo los siguientes contenidos en~/.bash_profile
:En unidades modernas, hay una complicación adicional relacionada con
~/.profile
. Si inicia sesión en un entorno gráfico (es decir, si el programa donde escribe su contraseña se ejecuta en modo gráfico), no obtendrá automáticamente un shell de inicio de sesión que lea~/.profile
. Dependiendo del programa de inicio de sesión gráfico, del administrador de ventanas o del entorno de escritorio que ejecute después, y de cómo su distribución configuró estos programas, su~/.profile
lectura puede o no ser leída. Si no es así, generalmente hay otro lugar donde puede definir variables de entorno y programas para iniciar cuando inicia sesión, pero desafortunadamente no hay una ubicación estándar.Tenga en cuenta que puede ver recomendaciones aquí y allá para colocar definiciones de variables de entorno
~/.bashrc
o siempre iniciar shells de inicio de sesión en terminales. Ambas son malas ideas. El problema más común con cualquiera de estas ideas es que las variables de entorno solo se establecerán en programas iniciados a través del terminal, no en programas que se inicien directamente con un ícono o menú o método abreviado de teclado.¹ Para completar, por solicitud: si
.bash_profile
no existe, bash también lo intenta.bash_login
antes de recurrir a.profile
. Siéntase libre de olvidar que existe.fuente
~/.bash_profile
se puede usar en lugar de~/.profile
, pero también debe incluir~/.bashrc
si el shell es interactivo. es engañoso ya que estos son problemas ortogonales. No importa si usa~/.bash_profile
o~/.profile
tiene que incluir~/.bashrc
en el que usa si desea que la configuración desde allí tenga efecto en el shell de inicio de sesión.~/.bashrc
tiene algo que ver con elegir en~/.bash_profile
lugar de lo~/.profile
cual no es cierto. Si alguien incluye~/.bashrc
algún tipo de script que se obtiene en el momento del inicio de sesión (aquí es~/.bash_profile
o~/.profile
) es porque quiere que la configuración~/.bashrc
se aplique al shell de inicio de sesión de la misma manera que se aplica a un shell sin inicio de sesión.De este breve artículo
fuente
En los viejos tiempos, cuando los pseudo tty no eran pseudo y realmente, bueno, mecanografiados, y los módems accedían a UNIX tan lento que podía ver cada letra impresa en su pantalla, la eficiencia era primordial. Para ayudar a la eficiencia, tenía un concepto de una ventana de inicio de sesión principal y cualquier otra ventana que realmente funcionara. En su ventana principal, le gustaría recibir notificaciones a cualquier correo nuevo, posiblemente ejecutar algunos otros programas en segundo plano.
Para respaldar esto, los shells obtuvieron un archivo
.profile
específicamente en 'shells de inicio de sesión'. Esto haría lo especial, una vez que se configura la sesión. Bash extendió esto un poco para mirar .bash_profile primero antes de .profile, de esta manera podría poner bash solo cosas allí (para que no arruinen el shell Bourne, etc., que también miró .profile). Otros shells, sin inicio de sesión, solo generarían el archivo rc, .bashrc (o .kshrc, etc.).Esto es un poco anacrónico ahora. No inicia sesión en un shell principal tanto como inicia sesión en un administrador de ventanas GUI. No hay una ventana principal diferente a cualquier otra ventana.
Mi sugerencia: no se preocupe por esta diferencia, se basa en un estilo anterior de uso de Unix. Elimina la diferencia en tus archivos. El contenido completo de .bash_profile debe ser:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc
Y ponga todo lo que realmente desea configurar en .bashrc
Recuerde que .bashrc se obtiene de todos los shells, interactivos y no interactivos. Puede cortocircuitar el abastecimiento de shells no interactivos colocando este código cerca de la parte superior de .bashrc:
[[ $- != *i* ]] && return
fuente
.$HOME/.bashrc
Rich mostró anteriormente, la configuración.bashrc
estará disponible en shells de inicio de sesión y, por lo tanto, también en el entorno de escritorio. Por ejemplo, en mi sistema Fedora,gnome-session
se inicia como-$SHELL -c gnome-session
, por lo que.profile
se lee..bashrc
en.profile
no funciona, porque.profile
puede ejecutarse/bin/sh
y no bash (por ejemplo, en Ubuntu para un inicio de sesión gráfico de forma predeterminada), y ese shell puede no ser interactivo (por ejemplo, para un inicio de sesión gráfico).[[ $- != *i* ]] && return
"); Me gusta que algunos de mis.bashrc
se ejecuten incluso para shells no interactivos, específicamente para establecer env vars, cuando se emitenssh hostname {command}
, para que los comandos remotos se ejecuten correctamente (aunque el shell no sea interactivo). Pero otras configuraciones posteriores.bashrc
deben ser ignoradas. Por lo general, verifico para TERM = tonto y / o sin ajustar, y luego salgo temprano.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
[ -z "$PS1" ] && return
:? La tabla en mi respuesta está dando la lista de scripts ejecutados por Bash, independientemente del contenido de los scripts, si el script en sí tiene la línea[ -z "$PS1" ] && return
, por supuesto que tendría efecto, pero no creo que eso deba significar que debería cambiar el mesa.UN MEJOR COMENTARIO PARA EL JEFE DE / ETC / PERFIL
Sobre la base de la excelente respuesta de Flimm anterior, inserté este nuevo comentario en la cabeza de mi perfil de Debian / etc / (es posible que deba ajustarlo para su distribución) :
Y esta nota al principio de cada uno de los otros archivos de configuración para referirse a ella:
Vale la pena señalar que creo que es el perfil / etc / de Debian por defecto (incluye) /etc/bash.bashrc (ahí es cuando existe /etc/bash.bashrc). Por lo tanto, los scripts de inicio de sesión leen ambos archivos / etc, mientras que los que no lo hacen solo bash.bashrc.
También cabe destacar que /etc/bash.bashrc está configurado para no hacer nada cuando no se ejecuta de forma interactiva. Entonces, estos dos archivos son solo para scripts interactivos.
fuente
La lógica de configuración de bash en sí no es una locura complicada y se explica en otras respuestas en esta página, en serverfault y en muchos blogs. Sin embargo, el problema es lo que las distribuciones de Linux hacen de bash , me refiero a las complejas y diversas formas en que configuran bash de forma predeterminada. http://mywiki.wooledge.org/DotFiles menciona brevemente algunas de estas peculiaridades. Aquí hay una traza de muestra en Fedora 29, que muestra qué archivos se originan, qué otros archivos y en qué orden para un escenario muy simple: conectarse de forma remota con ssh y luego iniciar otra subshell:
La lógica más compleja de Fedora está en
/etc/bashrc
. Como se ve arriba,/etc/bashrc
es un archivo que Bash no conoce, es decir, no directamente. Fedora/etc/bashrc
prueba si:... y luego hace cosas completamente diferentes dependiendo de eso.
Si cree que puede recordar el gráfico anterior, entonces es una lástima porque no es suficiente: este gráfico simplemente describe un solo escenario, suceden cosas ligeramente diferentes cuando se ejecutan scripts no interactivos o se inicia una sesión gráfica. He omitido
~/.profile
. He omitidobash_completion
guiones. Por razones de compatibilidad con versiones anteriores, invocar bash como en/bin/sh
lugar de/bin/bash
cambiar su comportamiento. ¿Qué pasa con zsh y otras conchas? Y, por supuesto, las diferentes distribuciones de Linux hacen las cosas de manera diferente, por ejemplo, Debian y Ubuntu vienen con una versión no estándar de bas h, tiene personalizaciones específicas de Debian. En particular, busca un archivo inusual:/etc/bash.bashrc
. Incluso si se atiene a una única distribución de Linux, probablemente evolucione con el tiempo. Espere: ni siquiera hemos tocado macOS, FreeBSD, ... Finalmente, pensemos en los usuarios que se quedan con las formas aún más creativas que sus administradores han configurado el sistema que tienen que usar.Como lo demuestra el flujo interminable de discusiones sobre este tema, es una causa perdida. Mientras solo desee agregar nuevos valores, algunos "prueba y error" tienden a ser suficientes. La verdadera diversión comienza cuando desea modificar en un archivo (usuario) algo ya definido en otro (en / etc). Entonces prepárese para pasar un tiempo diseñando una solución que nunca será portátil.
Para divertirse un poco más, aquí está el "gráfico fuente" para el mismo escenario simple en Clear Linux a partir de junio de 2019:
fuente