web-dev-qa-db-fra.com

À propos de .bash_profile, .bashrc et où un alias devrait-il être écrit?

Possibilité de dupliquer: Quelle est la différence entre .bashrc, .bash_profile et .environment?

Il semble que si j'utilise

alias ls='ls -F'

dans .bashrc sous Mac OS X, le shell nouvellement créé n'aura pas cet alias. Je dois taper bash encore et cet alias sera en vigueur.

Et si je me connecte à Linux sur la société d'hébergement, le .bashrc Le fichier a une ligne de commentaire qui dit:

Pour Shell non connecté

et le .bash_profile le fichier a un commentaire qui dit

pour la connexion Shell

Alors, où les alias devraient-ils être écrits? Pourquoi séparons-nous le shell de connexion et le shell non-login?

Certaines pages Web utilisent .bash_aliases, mais cela ne fonctionne pas sous Mac OS X, semble-t-il.

117

La raison pour laquelle vous séparez le shell login et non-login est parce que le fichier .bashrc Est rechargé à chaque fois que vous démarrez une nouvelle copie de Bash. Le fichier .profile Est chargé uniquement lorsque vous vous connectez ou utilisez l'indicateur approprié pour indiquer à Bash de jouer le rôle d'un shell de connexion.

Personnellement,

  • Je mets ma configuration PATH dans un fichier .profile (Car j’utilise parfois d’autres shells);
  • Je mets mes alias et fonctions Bash dans mon fichier .bashrc;
  • Je mets ça

    #!/bin/bash
    #
    # CRM .bash_profile Time-stamp: "2008-12-07 19:42"
    #
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # get my PATH setup
    source ~/.bashrc  # get my Bash aliases
    

    dans mon fichier .bash_profile.

Oh, et la raison pour laquelle vous devez taper bash à nouveau pour obtenir le nouvel alias est que Bash charge votre fichier .bashrc Au démarrage mais qu'il ne le recharge pas à moins que vous ne le lui indiquiez. Vous pouvez recharger le fichier .bashrc (Sans avoir besoin d’un second shell) en tapant

source ~/.bashrc

qui charge le fichier .bashrc comme si vous aviez tapé les commandes directement dans Bash.

157
Charlie Martin

Départ http://mywiki.wooledge.org/DotFiles pour une excellente ressource sur le sujet en dehors de man bash.

Sommaire:

  • Vous ne vous connectez qu'une seule fois, et c'est à ce moment-là que ~/.bash_profile Ou ~/.profile Est lu et exécuté. Comme tout ce que vous exécutez à partir de votre shell de connexion hérite de son environnement, vous devez y placer toutes vos variables d'environnement . Comme LESS, PATH, MANPATH, LC_*, ... Pour un exemple, voir: Mon .profile
  • Une fois que vous vous êtes connecté, vous pouvez exécuter plusieurs autres obus. Imaginez vous connecter, exécuter X et démarrer X en démarrant quelques terminaux avec des shells bash. Cela signifie que votre shell de connexion a démarré X, qui a hérité de ses variables d'environnement, qui ont démarré vos terminaux, ainsi que vos shells bash sans connexion. Vos variables d’environnement ont été transmises dans l’ensemble de la chaîne. Par conséquent, vos shells non connectés ne doivent plus les charger. Les shells non connectés n'exécutent que ~/.bashrc, Pas /.profile Ou ~/.bash_profile, Pour cette raison exacte, donc définissez là tout ce qui ne s'applique bash . Ce sont des fonctions, des alias, des variables uniquement bash comme HISTSIZE (ce n'est pas une variable d'environnement, ne l'exportez pas!) , les options du shell avec set et shopt, etc. Pour un exemple, voir: Mon .bashrc
  • Maintenant, comme particularité d'UNIX, un login-shell n'exécute PAS ~/.bashrc Mais seulement ~/.profile Ou ~/.bash_profile, Vous devez donc le rechercher manuellement à partir de ce dernier. Vous me verrez faire cela dans mon ~/.profile Aussi: source ~/.bashrc.
117
lhunath

De la page de manuel bash:

Lorsque bash est appelé en tant que shell de connexion interactif ou non interactif avec l'option --login, Il lit et exécute d'abord les commandes du fichier /etc/profile, Si ce fichier existe. Après avoir lu ce fichier, il recherche dans cet ordre ~/.bash_profile, ~/.bash_login Et ~/.profile, Puis lit et exécute les commandes à partir de la première qui existe et est lisible. L'option --noprofile Peut être utilisée au démarrage de l'environnement Shell pour empêcher ce comportement.

Lorsqu'un shell de connexion se ferme, bash lit et exécute les commandes du fichier ~/.bash_logout, S'il existe.

Lorsqu'un shell interactif qui n'est pas un login se lance, bash lit et exécute les commandes de ~/.bashrc, Si ce fichier existe. Cela peut être inhibé en utilisant l'option --norc. L'option de fichier --rcfile Forcera bash à lire et à exécuter des commandes à partir du fichier au lieu de ~/.bashrc.

Ainsi, si vous souhaitez obtenir le même comportement pour les shells de connexion et les shells interactifs autres que de login, vous devez placer toutes vos commandes dans .bashrc Ou .bash_profile, Puis disposer de l'autre fichier. source le premier.

12
Adam Rosenfield

.bash_profile est chargé pour un "shell de connexion". Je ne suis pas sûr de ce que cela serait sous OS X, mais sous Linux, il s’agit de X11 ou d’un terminal virtuel.

.bashrc est chargé à chaque fois que vous exécutez Bash. C’est là que vous devez placer les éléments que vous souhaitez charger chaque fois que vous ouvrez une nouvelle fenêtre Terminal.app.

Personnellement, j'ai tout mis dans .bashrc afin que je n'ai pas à redémarrer l'application pour que les modifications prennent effet.

2
Sionide21