428 votes

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

Pour créer un alias pour le Terminal dans OS X, vous pouvez soit mettre les alias dans .bash_profile o .bashrc . Quelle est la différence entre les deux et pourquoi choisirais-je de mettre des alias dans l'un et pas dans l'autre ?

8 votes

Je ne veux pas décourager la connaissance d'Unix ici, mais bash est une pure bête UNIX, donc vous pourriez obtenir une meilleure connaissance ou avoir une réponse à cette question plusieurs fois sur un site partenaire. Il y a bien plus de 200 paires question/réponse sur bashrc sur unix

2 votes

Il y a également un profil... Voir cette question sur Stack Overflow.

2 votes

Si vous brew install bash et utiliser iTerm2, vous pourriez définir profile -> command a /usr/local/bin/bash qui chargera .bashrc par défaut après .bash_profile . Cela vous donne aussi Bash 4 goodies...

436voto

Alex Points 8703

.bash_profile est exécuté pour les shells de connexion, tandis que .bashrc est exécuté pour les shells interactifs sans login.

Lorsque vous vous connectez (en tapant le nom d'utilisateur et le mot de passe) via la console, soit en restant sur la machine, soit à distance via ssh : .bash_profile est exécuté pour configurer votre shell avant l'invite de commande initiale.

Mais, si vous vous êtes déjà connecté à votre machine et que vous ouvrez une nouvelle fenêtre de terminal (xterm), alors .bashrc est exécuté avant l'invite de commande de la fenêtre. .bashrc est également lancé lorsque vous démarrez une nouvelle instance de bash en tapant /bin/bash dans un terminal.

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

114 votes

On OS X, Terminal by default runs a login shell every time - J'ai toujours été si confuse de ne pas m'en rendre compte. Super info !

8 votes

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 dont il est question dans la réponse, OS X semble toujours considérer que tout est un shell de connexion, car .zprofile s'exécute à chaque fois.

4 votes

Pour ceux qui recherchent une explication approfondie des combinaisons de shells login/non-login et interactif/non-interactif et du moment où ils exécutent ces fichiers de configuration, voir unix.stackexchange.com/a/46856/38715

77voto

Lloyd Cotten Points 1388

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

Cependant, si vous ajoutez ce qui suit à votre .bash_profile vous pouvez ensuite tout déplacer dans votre .bashrc afin de tout regrouper en un seul endroit au lieu de deux :

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

0 votes

Ou vous pouvez simplement faire cd ~ ; ln -s .bashrc .bash_profile .

7 votes

Ces 2 fichiers de configuration ont une fonction clairement distincte. Dans certains cas, il est nécessaire d'avoir des choses à initialiser en début de session et seulement là ( ~/.bash_profile ). Il est aussi souvent nécessaire d'avoir des choses à définir de manière incrémentale à chaque niveau du shell ( ~/.bashrc ). Ce n'est pas la meilleure idée de suggérer de supprimer cette liberté.

4 votes

@danielAzuelos : Lurch a laissé cette partie de côté, mais les sources du terminal OS X ~/.bash_profile pour chaque nouvelle fenêtre/onglet, il n'y a donc pas vraiment de moyen de séparer les deux en ce qui concerne le Terminal.

32voto

Donovan Points 1803

Pour MacOS, le code à mettre dans .bash_profile pour tout regrouper dans .bashrc est le suivant :

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

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

19 votes

Même si c'est vrai, en quoi est-ce différent de Réponse de Lurch en 2012 ?

13voto

Leo Points 239

TLDR ; utiliser .bash_profile pour vos alias.

La façon dont les différents fichiers d'initialisation fonctionnent ensemble est un peu plus compliquée, et il y a quelques cas spéciaux importants dans OSX. Voici les points essentiels :

  • Bash, sur n'importe quelle plateforme, exécute un ou plusieurs fichiers différents selon la façon dont il est invoqué. Les détails sont aquí .
  • L'application Terminal d'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, ce qui signifie que .bash_profile est appelé. D'où le conseil TLDR ci-dessus.
  • .bashrc est également une option, mais elle sera appelée chaque fois que vous créez un sous-shell (c'est-à-dire que vous invoquez la commande bash ), ce qui peut être source d'inefficacité si vous mettez à jour une variable à l'intérieur de celle-ci (par ex, PATH=/bin/foo:$PATH )
  • Les autres applications qui intègrent des terminaux peuvent choisir de suivre ou non la convention de Terminal App. Notamment, Visual Studio Code, par défaut, ne .
  • Les applications invoquées via l'interface graphique ne sont pas créées à partir d'un shell. Ainsi, il existe plusieurs mécanismes concurrents pour définir des variables d'environnement qu'elles peuvent voir, qui ont a changé au fil des ans .
  • Snippets qui appellent .bashrc de .bash_profile sont assez courants.

1 votes

Pourquoi exactement utiliser .bash_profile pour les alias compliqués ? Les éléments que vous énumérez ne concernent que partiellement les alias, donc au lieu d'énumérer simplement quelques points qui pourraient expliquer pourquoi cela semble compliqué ; pouvez-vous peut-être proposer un moyen de le rendre plus facile en respectant ces contraintes ?

0 votes

Je comprends votre point de vue. Ce n'est pas que l'utilisation de .bash_profile soit compliquée. C'est que la façon dont les fichiers sont invoqués est compliquée. Je vais mettre à jour.

1 votes

Appeler .bashrc à partir de .bash_profile est recommandé dans le manuel GNU bash - sinon comment définir les variables etc. dont vous avez besoin à la fois dans les shells de connexion et les shells non interactifs ?

0voto

Pour ubuntu/debain j'ajoute ce code à la fin de .bashrc :

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

Maintenant mes alias prennent effet dans tous les nouveaux terminaux (ou onglets) ouverts.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X