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

130

J'ai utilisé un certain nombre de systèmes basés sur * nix différents au cours des années, et il semble que chaque saveur de Bash que j'utilise ait un algorithme différent pour décider des scripts de démarrage à exécuter. Pour les tâches telles que la configuration des variables d'environnement et des alias et l'impression des messages de démarrage (par exemple, les MOTD), quel script de démarrage est l'endroit approprié pour effectuer ces tâches?

Quelle est la différence entre mettre les choses en .bashrc, .bash_profileet .environment? J'ai aussi vu d' autres fichiers tels que .login, .bash_loginet .profile; sont-ils jamais pertinents? Quelles sont les différences entre celles qui sont exécutées lors de la connexion physique, de la connexion à distance via ssh et de l'ouverture d'une nouvelle fenêtre de terminal? Existe-t-il des différences significatives entre les plates-formes (y compris Mac OS X (et son Terminal.app) et Cygwin Bash)?

Adam Rosenfield
la source

Réponses:

73

La principale différence avec les fichiers de configuration du shell est que certains ne sont lus que par des shells "login" (par exemple, lorsque vous vous connectez depuis un autre hôte ou que vous vous connectez à la console texte d'une machine Unix locale). ce sont ceux appelés, disons, .loginou .profileou .zlogin(selon le shell que vous utilisez).

Ensuite, vous avez des fichiers de configuration qui sont lus par des shells "interactifs" (comme dans, ceux connectés à un terminal (ou pseudo-terminal dans le cas, par exemple, d'un émulateur de terminal fonctionnant sous un système de fenêtrage). Ce sont ceux avec des noms comme .bashrc, .tcshrc, .zshrc, etc.

bashcomplique cela dans la mesure où il .bashrcn'est lu que par un shell à la fois interactif et non connecté , de sorte que la plupart des gens finissent par dire .bash_profileà eux de lire également .bashrcavec quelque chose comme

[[ -r ~/.bashrc ]] && . ~/.bashrc

D'autres shells se comportent différemment - par exemple avec zsh, .zshrcest toujours lu pour un shell interactif, que ce soit un shell de connexion ou non.

La page de manuel de bash explique les circonstances dans lesquelles chaque fichier est lu. Oui, le comportement est généralement cohérent entre les machines.

.profileest simplement le nom de fichier du script de connexion utilisé à l'origine par /bin/sh. bash, étant généralement rétrocompatible avec /bin/sh, lira .profiles'il en existe un.

Cos
la source
48

C'est simple. C'est expliqué dans man bash:

/bin/bash
       The bash executable
/etc/profile
       The systemwide initialization file, executed for login shells
~/.bash_profile
       The personal initialization file, executed for login shells
~/.bashrc
       The individual per-interactive-shell startup file
~/.bash_logout
       The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
       Individual readline initialization file

Les shells de connexion sont ceux qui sont lus lors de la connexion (ils ne sont donc pas exécutés lors du simple démarrage de xterm, par exemple). Il existe d'autres moyens de se connecter. Par exemple en utilisant un gestionnaire d'affichage X. Ceux-ci ont d'autres moyens de lire et d'exporter les variables d'environnement au moment de la connexion.

Lisez également le INVOCATIONchapitre du manuel. Il dit: "Les paragraphes suivants décrivent comment bash exécute ses fichiers de démarrage." , je pense que c'est un spot-on :) Cela explique aussi ce qu'est un shell "interactif".

Bash ne sait pas .environment. Je soupçonne que c'est un fichier de votre distribution, pour définir des variables d'environnement indépendantes du shell que vous conduisez.

Johannes Schaub - litb
la source
1
Pourriez-vous ajouter /etc/bashrcpour compléter la réponse?
Nemoden le
9

Classiquement, ~/.profileest utilisé par Bourne Shell et est probablement pris en charge par Bash en tant que mesure héritée. Encore une fois, ~/.loginet ~/.cshrcont été utilisés par C Shell - je ne suis pas sûr que Bash les utilise du tout.

Le ~/.bash_profileserait utilisé une fois, lors de la connexion. Le ~/.bashrcscript est lu à chaque fois qu'un shell est lancé. C'est analogue à /.cshrcpour C Shell.

Une conséquence est que les éléments ~/.bashrcdoivent être aussi légers (minimaux) que possible pour réduire la surcharge lors du démarrage d'un shell sans connexion.

Je crois que le ~/.environmentfichier est un fichier de compatibilité pour Korn Shell.

Jonathan Leffler
la source
7

J'ai trouvé des informations sur .bashrc et .bash_profile ici pour résumer:

.bash_profile est exécuté lorsque vous vous connectez. Les éléments que vous y mettez peuvent être votre PATH et d'autres variables d'environnement importantes.

.bashrc est utilisé pour les shells sans connexion. Je ne sais pas ce que cela signifie. Je sais que RedHat l'exécute chaque fois que vous démarrez un autre shell (su à cet utilisateur ou simplement en appelant à nouveau bash). Vous voudrez peut-être y mettre des alias, mais encore une fois, je ne suis pas sûr de ce que cela signifie. Je l'ignore simplement moi-même.

.profile est l'équivalent de .bash_profile pour la racine. Je pense que le nom a été changé pour permettre à d'autres shells (csh, sh, tcsh) de l'utiliser également. (vous n'en avez pas besoin en tant qu'utilisateur)

Il y a aussi .bash_logout qui s'exécute à, ouais bonne supposition ... déconnexion. Vous voudrez peut-être arrêter les démons ou même faire un peu de ménage. Vous pouvez également y ajouter «effacer» si vous souhaitez effacer l'écran lorsque vous vous déconnectez.

Il y a aussi un suivi complet sur chacun des fichiers de configuration ici

Celles-ci sont probablement même dépendantes de la distribution, toutes les distributions ne choisissent pas d'avoir chaque configuration avec elles et certaines en ont encore plus. Mais lorsqu'ils portent le même nom, ils incluent généralement le même contenu.

Filip Ekberg
la source
4

Selon Josh Staiger , Terminal.app de Mac OS X exécute en fait un shell de connexion plutôt qu'un shell sans connexion par défaut pour chaque nouvelle fenêtre de terminal, appelant .bash_profile au lieu de .bashrc.

Il recommande:

La plupart du temps, vous ne souhaitez pas conserver deux fichiers de configuration séparés pour les shells de connexion et de non-connexion - lorsque vous définissez un PATH, vous voulez qu'il s'applique aux deux. Vous pouvez résoudre ce problème en recherchant .bashrc à partir de votre fichier .bash_profile, puis en plaçant PATH et les paramètres communs dans .bashrc.

Pour ce faire, ajoutez les lignes suivantes à .bash_profile:

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

Maintenant, lorsque vous vous connectez à votre machine à partir d'une console, .bashrc sera appelé.

Rose Perrone
la source
2

Un bon endroit à regarder est la page de manuel de bash. Voici une version en ligne. Recherchez la section "INVOCATION".

PolyThinker
la source
0

J'ai utilisé des distributions de la famille Debian qui semblent s'exécuter .profile, mais pas .bash_profile, alors que les dérivés RHEL s'exécutent .bash_profileauparavant .profile.

Cela semble être un désordre lorsque vous devez configurer des variables d'environnement pour fonctionner dans n'importe quel système d'exploitation Linux.

séisme
la source