¿Cuál es la diferencia entre .bash_profile y .bashrc?

245

Para crear un alias para la Terminal en OS X, puede poner los alias en .bash_profileo .bashrc. ¿Cuál es la diferencia entre los dos y por qué elegiría poner alias en uno y no en el otro?

daviesgeek
fuente
55
No para desalentar el conocimiento de Unix aquí, pero bash es una bestia pura de UNIX, por lo que puede obtener un mejor conocimiento o responder esta pregunta varias veces en un sitio asociado. Hay más de 200 pares de preguntas / respuestas
bashrc
También hay un perfil ... Ver esta pregunta en Desbordamiento de pila.
Yaakov Baruch
2
Si usted brew install bashy utilizar iTerm2, podría configurar profile -> commandpara /usr/local/bin/bashque cargará .bashrcde forma predeterminada después .bash_profile. Esto también te da golosinas de Bash 4 ...
Ray Foss
Escuché que .bashrc no se ha usado durante años, y por defecto no funcionará, y .bash_profile es lo que hay en macosx. Y probé .bashrc yt no funcionó para mí, pero .bash_profile sí
funcionó

Respuestas:

247

.bash_profilese ejecuta para shells de inicio de sesión, mientras que .bashrcse ejecuta para shells interactivos sin inicio de sesión.

Cuando inicia sesión (escriba nombre de usuario y contraseña) a través de la consola, ya sea sentado en la máquina o de forma remota a través de ssh: .bash_profilese ejecuta para configurar su shell antes del símbolo del sistema inicial.

Pero, si ya ha iniciado sesión en su máquina y abre una nueva ventana de terminal (xterm), .bashrcse ejecuta antes del símbolo del sistema de la ventana. .bashrctambién se ejecuta cuando inicia una nueva instancia de bash escribiendo /bin/bashuna terminal.

En OS X, Terminal por defecto ejecuta un shell de inicio de sesión cada vez, por lo que esto es un poco diferente a la mayoría de los otros sistemas, pero puede configurarlo en las preferencias.

Alex
fuente
57
On OS X, Terminal by default runs a login shell every time- Siempre he estado tan confundido al no darme cuenta de esto. Gran información!
vaughan
1
@Alex, ¿por qué el terminal OS X ejecuta un shell de inicio de sesión cada vez?
Pacerier
17
Porque algunos desarrolladores de Apple no se dieron cuenta de la diferencia originalmente y ahora está consagrado en un mumbo jumbo.
Snowcrash
2
Estoy en OS X y uso zshell en lugar de bash e iTerm en lugar de Terminal. A pesar de que estoy usando un terminal diferente y un shell diferente al que se menciona en la respuesta, OS X todavía parece estar considerando todo como un shell de inicio de sesión, porque .zprofilese ejecuta cada vez.
Adam Zerner el
1
Para aquellos que buscan una explicación exhaustiva de las combinaciones de inicio de sesión / no inicio de sesión y shells interactivos / no interactivos y cuando ejecutan estos archivos de configuración, consulte unix.stackexchange.com/a/46856/38715
kevinmicke
45

X11 lo mirará .bashrcmientras que un Terminal "regular" lo verá.bash_profile

Sin embargo, si agrega lo siguiente a su .bash_profile, puede mover todo a su .bashrcarchivo para consolidar todo en un lugar en lugar de dos:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi
Estacada
fuente
O simplemente podrías hacerlo cd ~ ; ln -s .bashrc .bash_profile.
lhf
55
Estos 2 archivos de configuración tienen una función claramente separada. En algunos casos, es necesario tener cosas para inicializar al comienzo de la sesión y solo allí ( ~/.bash_profile). También a menudo es necesario tener cosas para definir incrementalmente en cada nivel de shell ( ~/.bashrc). No es la mejor idea sugerir suprimir esta libertad.
dan
3
@danielAzuelos: Lurch omitió esta parte, pero el OS X Terminal se encarga ~/.bash_profilede cada nueva ventana / pestaña, por lo que no hay realmente una manera de separarlos en lo que respecta al Terminal.
mipadi
14
@mipadi Todavía hay valor para separarlos. Por ejemplo, .bash_profilenunca se puede obtener de nuevo en el proceso secundario. Cada nivel de las fuentes del golpe anidadas .bashrc, por lo que si se pone algo así como export A=a:$Aen .bashrc, su $Aobtendrá más tiempo en Bash anidada. Normalmente dejo variables de entorno en el perfil y alias en RC.
Franklin Yu el
@FranklinYu Puede que no sea un gran problema para muchas personas, ¡pero estoy totalmente de acuerdo! Es un gran punto técnico para recordarle a la gente y merece mucho más votos a favor.
Subfuzion
24

Para macOS, el código .bash_profilepara consolidar todo .bashrces el siguiente:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Esto es más específico para el usuario del terminal Mac.

frzhen
fuente
66
Si bien es cierto, ¿cómo es esto diferente de la respuesta de Lurch de 2012 ?
Arjan
0

TLDR; use .bash_profilepara sus alias.

La forma en que los diferentes archivos de inicialización funcionan juntos es un poco más complicada, y hay algunos casos especiales importantes en OSX. Aquí están los aspectos más destacados:

  • Bash, en cualquier plataforma, ejecuta uno de varios archivos diferentes dependiendo de cómo se invoque. Los detalles están aquí .
  • La aplicación Terminal de OSX hace algo no estándar: crea cada nueva pestaña o ventana como si fuera un shell de inicio de sesión, lo que significa que .bash_profilese llama. Por lo tanto, el consejo TLDR anterior.
  • .bashrctambién es una opción, pero se llamará cada vez que cree una subshell (es decir, invocar bash), lo que puede crear ineficiencia si actualiza una variable dentro de ella (por ejemplo, PATH=/bin/foo:$PATH)
  • Otras aplicaciones que tienen terminales integradas pueden optar por seguir la convención de la aplicación Terminal o no. Notablemente, Visual Studio Code, por defecto, no lo hace .
  • Las aplicaciones invocadas a través de la GUI no se generan desde un shell. Por lo tanto, hay varios mecanismos competitivos para establecer variables de entorno para que puedan ver, que han cambiado con los años .
  • Los fragmentos que llaman .bashrcdesde .bash_profileson bastante comunes. No lo recomiendo, pero es una preferencia.
León
fuente
¿Por qué exactamente se usa .bash_profilepara alias complicado? Los elementos que enumera solo son parcialmente sobre alias, por lo que en lugar de enumerar algunas viñetas que podrían explicar por qué parece ser complicado, ¿puede proponer una forma de facilitarlo dentro de estas restricciones?
nohillside
Entiendo tu argumento. No es que usar .bash_profile sea complicado. Es que la forma en que se invocan los archivos es complicada. Voy a actualizar
Leo
Se recomienda llamar a .bashrc desde .bash_profile en el manual de GNU bash; de lo contrario, ¿cómo se configuran las variables, etc. que necesita tanto en los shells de inicio de sesión como en los no interactivos?
Mark
Cada emulador de terminal que utilizo en diferentes sistemas operativos tiene una opción para ejecutar nuevas ventanas como shell de inicio de sesión, xterm y Xfce para nombrar solo dos.
fd0