Quelle est la différence entre .bash_profile et .bashrc?

245

Pour créer un alias pour le terminal sous OS X, vous pouvez insérer les alias dans .bash_profileou .bashrc. Quelle est la différence entre les deux et pourquoi devrais-je choisir de mettre des pseudonymes dans l'un et pas dans l'autre?

Daviesgeek
la source
5
Il ne s'agit pas de décourager les connaissances relatives à Unix, mais bash est une pure bête UNIX. Vous pouvez donc en apprendre davantage ou obtenir une réponse à cette question plusieurs fois sur un site partenaire. Il y a plus de 200 paires questions / réponses
bashrc
Il y a aussi .profile ... Voir cette question sur Stack Overflow.
Yaakov Baruch
2
Si vous brew install bashet utilisez iTerm2, vous pouvez définir profile -> commandsur /usr/local/bin/bashlequel sera chargé .bashrcpar défaut après .bash_profile. Cela vous donne également 4 friandises Bash ...
Ray Foss
J'ai entendu dire que .bashrc n'était pas utilisé depuis des années et que, par défaut, cela ne fonctionnerait pas. Et j’ai essayé .bashrc et t n’a pas fonctionné pour moi mais .bash_profile a fait
barlop

Réponses:

247

.bash_profileest exécuté pour les shells de connexion, tandis que .bashrcest exécuté pour les shells interactifs sans login.

Lorsque vous vous connectez (tapez le nom d'utilisateur et le mot de passe) via la console, assis devant la machine ou à distance via ssh: .bash_profileest exécuté pour configurer votre shell avant l'invite de commande initiale.

Toutefois, si vous êtes déjà connecté à votre ordinateur et ouvrez une nouvelle fenêtre de terminal (xterm), celui-ci .bashrcest exécuté avant l'invite de commande de la fenêtre. .bashrcest également exécuté lorsque vous démarrez une nouvelle instance bash en tapant /bin/bashun terminal.

Sous OS X, Terminal exécute par défaut un shell de connexion à chaque fois. C'est donc un peu différent de la plupart des autres systèmes, mais vous pouvez le configurer dans les préférences.

Alex
la source
57
On OS X, Terminal by default runs a login shell every time- J'ai toujours été si confus de ne pas m'en rendre compte. Super info!
vaughan
1
@Alex, Pourquoi un terminal OS X exécuterait-il un shell de connexion à chaque fois?
Pacerier
17
«Certains développeurs d’Apple n’avaient pas compris la différence à l’origine, et c’est désormais inscrit dans certains« charabia ».
Snowcrash
2
Je suis sous OS X et j'utilise zshell au lieu de bash et iTerm au lieu de Terminal. Malgré le fait que j'utilise un terminal et un shell différents de ceux décrits dans la réponse, OS X semble toujours considérer tout comme un shell de connexion, car il .zprofiles'exécute à chaque fois.
Adam Zerner
1
Pour ceux qui recherchent une explication détaillée des combinaisons de shells avec login / non-login et interactif / non-interactif et quand ils exécutent ces fichiers de configuration, voir unix.stackexchange.com/a/46856/38715
kevinmicke
45

X11 examinera votre .bashrctemps tandis qu'un terminal "normal" examinera.bash_profile

Toutefois, si vous ajoutez ce qui suit à votre .bash_profile, vous pouvez alors tout déplacer dans votre .bashrcfichier afin de tout regrouper au même endroit au lieu de deux:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi
Embardée
la source
Ou vous pouvez simplement faire cd ~ ; ln -s .bashrc .bash_profile.
Lhf
5
Ces 2 fichiers de configuration ont une fonction clairement séparée. Dans certains cas, il est nécessaire d’avoir des choses à initialiser au début de la session et seulement là ( ~/.bash_profile). Il est également souvent nécessaire de définir incrémentalement des éléments à chaque niveau de shell ( ~/.bashrc). Ce n'est pas la meilleure idée de suggérer de supprimer cette liberté.
Dan
3
@danielAzuelos: Lurch a laissé cette partie de côté, mais les sources du terminal OS X ~/.bash_profilepour chaque nouvelle fenêtre / onglet, il n'y a donc pas vraiment de moyen de séparer les deux en ce qui concerne Terminal.
Mipadi
14
@ mipadi Il est toujours utile de les séparer. Par exemple, .bash_profilene peut plus jamais être recherché dans un processus enfant. Chaque niveau de sources Bash imbriquées .bashrc, donc si vous mettez quelque chose comme export A=a:$Adans .bashrc, vous $Adeviendrez plus long dans Bash imbriqué. Je laisse généralement la variable d'environnement dans le profil et les alias dans RC.
Franklin Yu
@FranklinYu Peut ne pas être un gros problème pour beaucoup de gens, mais je suis totalement d'accord! C'est un bon point technique à rappeler aux gens et mérite bien plus de votes positifs.
Sous
24

Pour macOS, le code à intégrer .bash_profilepour tout consolider .bashrcest le suivant:

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

Ceci est plus spécifique pour les utilisateurs de terminaux Mac.

Frzhen
la source
6
Bien que cela soit vrai, en quoi est-ce différent de la réponse de Lurch de 2012 ?
Arjan
0

TLDR; utiliser .bash_profilepour vos alias.

La façon dont les différents fichiers d’initialisation fonctionnent ensemble est un peu plus compliquée et il existe quelques cas particuliers importants sous OSX. Voici les faits saillants:

  • Bash, sur n’importe quelle plate-forme, exécute l’un des fichiers différents en fonction de la manière dont il est appelé. Les détails sont ici .
  • L'application Terminal OSX fait quelque chose de non standard: elle crée chaque nouvel onglet ou fenêtre comme s'il s'agissait d'un shell de connexion, c'est-à- .bash_profiledire appelé. Ainsi, le conseil TLDR ci-dessus.
  • .bashrcest aussi une option, mais cela sera appelé à chaque fois que vous créez un sous-shell (c'est-à-dire, appelez-le bash), ce qui peut créer une inefficacité si vous mettez à jour une variable qu'il contient (par exemple, PATH=/bin/foo:$PATH)
  • Les autres applications dotées de terminaux intégrés peuvent choisir de suivre ou non la convention de Terminal App. Notamment, le code Visual Studio, par défaut, ne le fait pas .
  • Les applications appelées via l'interface graphique ne sont pas générées par un shell. Ainsi, il existe plusieurs mécanismes concurrents pour définir les variables d'environnement à voir, qui ont changé au fil des ans .
  • Snippets qui font appel à .bashrcpartir .bash_profilesont assez communs. Je ne le recommande pas, mais c'est une préférence.
Leo
la source
Pourquoi l'utilisation .bash_profiledes alias est-elle compliquée? Les éléments que vous avez énumérés ne traitent que partiellement d'alias. Par conséquent, au lieu de simplement énumérer certains points qui pourraient expliquer pourquoi cela semble compliqué, pouvez-vous proposer un moyen de simplifier ces tâches?
nohillside
Je vois ce que tu veux dire. Ce n'est pas que l'utilisation de .bash_profile est compliquée. C'est que la façon dont les fichiers sont invoqués est compliquée. Je mettrai à jour.
Leo
Il est recommandé d'appeler .bashrc à partir de .bash_profile dans le manuel GNU bash - sinon, comment définir les variables, etc., dont vous avez besoin à la fois dans les shells de connexion et ceux qui ne le sont pas?
Mark
Chaque émulateur de terminal que j'utilise sur différents systèmes d'exploitation dispose d'une option permettant d'exécuter de nouvelles fenêtres en tant que shell de connexion, xterm et Xfce, pour n'en nommer que deux.
fd0