Quelle est la différence entre les deux.bashrc,.profil bash, et.de l'environnement?

j'ai utilisé un certain nombre de systèmes différents *nix-basés des années, et il semble que chaque saveur de Bash que j'utilise a un algorithme différent pour décider quels scripts de démarrage à exécuter. Pour les tâches telles que la mise en place de variables d'environnement et d'Alias et l'impression de messages de démarrage (par exemple MOTDs), quel script de démarrage est l'endroit approprié pour le faire?

Quelle est la différence entre mettre des choses dans .bashrc , .bash_profile , et .environment ? J'ai également vu d'autres fichiers tels que .login , .bash_login , et .profile ; sont-ils jamais pertinents? Quelles sont les différences entre ceux qui sont lancés lors de la connexion physique, de la connexion à distance via ssh et de l'ouverture d'une nouvelle fenêtre de terminal? Y a-t-il des différences significatives entre les plates-formes (y compris Mac OS X (et son Terminal)?app) et Cygwin Bash)?

130
demandé sur Adam Rosenfield 2009-01-06 06:58:34

7 réponses

la principale différence avec les fichiers de configuration de l'interpréteur de commandes est que certains fichiers ne sont lus que par les interpréteurs de commandes" login " (par ex. lorsque vous vous connectez à partir d'un autre hôte, ou à la console de texte d'une machine unix locale). ce sont ceux appelés, disons, .login ou .profile ou .zlogin (selon le shell que vous utilisez).

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

bash complique cela en ce que .bashrc est seulement lu par un shell qui est à la fois interactive et non-login , donc vous trouverez la plupart des gens finissent par dire leur .bash_profile pour lire aussi .bashrc avec quelque chose comme

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

autres shells se comportent différemment-par exemple avec zsh , .zshrc est toujours lu pour un shell interactif, que ce soit un login ou non.

la page de manuel de bash explique les circonstances dans lesquelles chaque fichier est lu. Oui, le comportement est généralement constant d'une machine à l'autre.

.profile est simplement le nom du fichier de script de connexion utilisé à l'origine par /bin/sh . bash , étant généralement rétro-compatible avec /bin/sh , se lira .profile si l'un existe.

73
répondu Cos 2012-10-04 05:16:54

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 démarrage de xterm, par exemple). Il y a d'autres moyens de se connecter. Par exemple, utiliser un gestionnaire d'affichage X. Ceux qui ont d'autres façons de lire et d'exporter les variables d'environnement au moment de la connexion.

lire aussi le chapitre INVOCATION du manuel. Il est dit " ce qui suit les paragraphes décrivent comment bash exécute ses fichiers de démarrage." , je pense que c'est un spot-on :) il explique ce qu'est un shell" interactif " aussi.

Bash ne connaît 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.

48
répondu Johannes Schaub - litb 2009-01-06 15:29:38

classiquement, ~/.profile est utilisé par Bourne Shell, et est probablement pris en charge par Bash comme une mesure d'héritage. Encore une fois, ~/.login et ~/.cshrc ont été utilisés par C Shell - Je ne suis pas sûr que Bash les utilise du tout.

le ~/.bash_profile sera utilisé une fois, lors de la connexion. Le script ~/.bashrc est lu chaque fois qu'un shell est démarré. Ceci est analogue à /.cshrc pour la couche C.

une conséquence est que les choses dans ~/.bashrc devrait être aussi léger (minimal) que possible pour réduire les frais généraux lors du démarrage d'un shell non-login.

je crois que le fichier ~/.environment est un fichier de compatibilité pour Korn Shell.

9
répondu Jonathan Leffler 2009-01-06 06:03:43

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

.bash_profile est exécuté lorsque vous connexion. Ce que vous mettez là pourrait être votre chemin et d'autres importants les variables d'environnement.

.bashrc est utilisé pour les shells non login. Je ne suis pas sûr de ce que cela signifie. Je sais que RedHat il exécute chaque fois que vous démarrez un autre shell (su à cet utilisateur ou simplement en appelant bash nouveau) Vous pouvez voulez mettre des alias de là, mais de nouveau Je ne suis pas sûr de ce que cela signifie. Je simplement l'ignorer moi-même.

.le profil est l'équivalent de .bash_profile pour la racine. Je pense le nom est changé pour laisser l'autre coques (csh, sh, tcsh) l'utiliser ainsi. (vous n'en avez pas besoin en tant qu'utilisateur)

il y en a aussi .bash_logout qui exécute sur, oui bonne estimation...déconnexion. Vous pourriez vouloir arrêter deamons ou même faire un peu de ménage. Vous pouvez ajoutez également "clair" si vous voulez effacer l'écran lorsque vous vous déconnectez.

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

ceux-ci sont probablement même distro.- dépendant, pas tous les distros choisissent d'avoir chaque configuration avec eux et certains ont encore plus. Mais quand ils ont le même nom, ils incluent généralement le même contenu.

7
répondu Filip Ekberg 2009-01-06 14:26:25

selon Josh Staiger , Terminal de Mac OS X.application exécute un shell de connexion plutôt qu'un non-shell de connexion par défaut pour chaque nouvelle fenêtre du terminal appelant .bash_profile au lieu de .bashrc.

il recommande:

la Plupart du temps vous ne voulez pas maintenir deux fichiers de configuration pour les shells login et non-login - lorsque vous définissez un chemin, vous voulez qu'il s'appliquent à la fois. Tu peux arranger ça en approvisionnement. bashrc de votre .bash_profile fichier, puis la mise chemin et les paramètres communs .bashrc.

pour ce faire, ajouter 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ée.

4
répondu Rose Perrone 2012-02-27 00:22:05

Un bon endroit pour regarder est la page de manuel de bash. ici est une version en ligne. Cherchez la section "INVOCATION".

2
répondu PolyThinker 2009-01-06 04:06:21

j'ai utilisé Debian-family distros qui semble exécuter .profile , mais pas .bash_profile , tandis que les dérivés du RHEL exécutent .bash_profile avant .profile .

il semble que ce soit un gâchis quand vous devez configurer des variables d'environnement pour fonctionner dans N'importe quel OS Linux.

0
répondu seismick 2012-10-20 03:45:00