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?


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.


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

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.


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.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.