Comment charger ~ / .bash_profile lors de la saisie de bash depuis zsh?

J’ai utilisé bash pendant deux ans, et j’ai juste essayé de basculer vers zsh shell sur mon OS X via homebrew. Et j’ai défini mon shell par défaut (login) sur zsh, et j’ai confirmé qu’il était correctement défini en voyant que lorsque je lance mon terminal, c’est le shell zsh utilisé par défaut.

Cependant, lorsque j’essaie d’entrer dans shell bash depuis zsh, il semble que je ne charge pas ~/.bash_profile , car je ne peux pas exécuter ma commande en utilisant des alias, qui sont définis dans mon ~/.bash_profile comme alias julia="~/juila/julia" , etc. En outre, l’invite n’est pas ce que je définis dans le fichier et renvoie à la place bash-3.2$ .

Pour certaines raisons, lorsque je configure mon shell de connexion sur bash et que je ~/.zshrc zsh depuis bash, ~/.zshrc est chargé correctement.

Alors, pourquoi n’est-il pas chargé quand je lance bash depuis zsh? Mon ~/.bash_profile est symboliquement lié à ~/Dropbox/.bash_profile afin de le synchroniser avec mes autres ordinateurs. Peut-être que cela cause le problème?

Un bash interactif lit votre ~/.bash_profile s’il s’agit d’un shell de connexion ou de votre ~/.bashrc s’il ne s’agit pas d’un shell de connexion.

Un .bash_profile typique contiendra quelque chose comme:

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

Donc, .bashrc peut contenir des commandes à exécuter par des shells de connexion ou non.

Si vous exécutez bash -l plutôt que simplement bash , il devrait lire votre .bash_profile .

Référence: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html

En complément de l’excellente réponse de @Keith Thompson:

macOS :

Comme @chepner le dit succinctement (emphase à moi):

Sous OS X, bash n’est pas utilisé dans le processus de connexion initial [au moment du démarrage], et le processus Terminal.app (ou un autre émulateur de terminal) existe en dehors des sessions de bash préexistantes . read: shell bash interactif] (par défaut) se traite comme une nouvelle session de connexion .

Par conséquent, certains utilisateurs d’OSX ne créent que ~/.bash_profile , et ne se préoccupent jamais de ~/.bashrc , car TOUS les shocks de bash interactifs sont des shells de connexion .

Linux :

Sous Linux, la situation est généralement inversée : les shells bash créés interactivement sont des shells NON-login interactifs, c’est donc ~/.bashrc qui compte.

En conséquence, de nombreux utilisateurs Linux ne traitent que par ~/.bashrc .


Pour conserver les profils bash qui fonctionnent sur les deux platesformes , utilisez la technique mentionnée par @Keith Thompson:

  • Mettez vos définitions (alias, fonctions, …) dans ~/.bashrc
  • Ajoutez la ligne suivante à ~/.bash_profile
 [[ -f ~/.bashrc ]] && . ~/.bashrc 

Copiez le contenu de ~ / .bash_profile et collez-le au bas du fichier ~ / .zshrc.

Pour les utilisateurs de ZSH sur MacO, je me suis retrouvé avec une seule ligne.

Tout au bas du fichier ~ / .zshrc, j’ai ajouté la ligne suivante:

 bash -l 

Qu’est-ce qu’il fait est simplement charger les parameters .bash_profile (alias, fonction, export $ PATH, …)

Si vous décidez de vous débarrasser de ZSH et que vous revenez à BASH, vous reviendrez à la normale sans aucun problème.

Ouvrez ~/.zshrc et, tout en bas du fichier, ajoutez les éléments suivants:

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

Chaque fois que vous ouvrez le terminal, il charge tout ce qui est défini dans ~/.bash_profile (si le fichier existe). Avec cela, vous pouvez conserver vos parameters personnalisés pour zsh (couleurs, etc.). Et vous obtenez de garder vos parameters de shell personnalisés dans le fichier .bash_profile .

C’est beaucoup plus propre que d’utiliser bash -l IMO.

Si vous préférez placer vos parameters dans .bashrc ou .bash_login ou .bash_login , vous pouvez faire la même chose pour eux.

Si c’est quelque chose que vous ne faites pas souvent, ou s’il n’est simplement pas approprié d’apporter des modifications, vous pouvez également «générer» le fichier .bash_profil après avoir lancé le shell enfant bash.

 . ~/.bash_profile 

Cela va extraire les parameters que vous avez définis dans le script .bash_profile pour la durée de vie de cette session shell. Dans la plupart des cas, vous devriez être capable de répéter cette commande, de manière à pouvoir tester facilement les modifications que vous apportez sans avoir à vous connecter complètement, et à mettre à jour toutes vos sessions shell existantes si vous effectuez des mises à niveau vers les fichiers .bash_profile & / ou .bashrc .