web-dev-qa-db-fra.com

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

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 version de Bash que j'utilise utilise 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, MOTD), quel script de démarrage est le lieu approprié pour les effectuer?

Quelle est la différence entre mettre des éléments dans .bashrc, .bash_profile et .environment? J'ai également vu d'autres fichiers tels que .login, .bash_login et .profile; Sont-ils toujours 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 application Terminal.app) et Cygwin Bash)?

130
Adam Rosenfield

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

Ensuite, vous avez des fichiers de configuration qui sont lus par des shells "interactifs" (comme 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.

bash complique ceci en ce que .bashrc est niquement lu par un shell qui est à la fois interactif et non-login , vous constaterez donc que la plupart des gens finissent par dire à leur .bash_profile de lire également .bashrc avec quelque chose comme

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

Les autres shells se comportent différemment - par exemple, avec zsh, .zshrc est toujours lu pour un shell interactif, que ce soit avec 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 cohérent entre les machines.

.profile est simplement le nom de fichier du script de connexion utilisé à l'origine par /bin/sh. bash, généralement compatible avec /bin/sh, lira .profile s'il en existe un.

73
Cos

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 une fois que vous vous connectez (ils ne sont donc pas exécutés lors du 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 des variables d'environnement au moment de la connexion.

Lisez également le chapitre INVOCATION de ce manuel. Il dit "Les paragraphes suivants décrivent comment bash exécute ses fichiers de démarrage.", je pense que c'est une bonne idée :) Il explique ce qu'est un shell "interactif".

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

Classiquement, ~/.profile est utilisé par Bourne Shell et est probablement pris en charge par Bash en tant que mesure héritée. 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 démarrage d'un shell. Ceci est analogue à /.cshrc pour C Shell.

Une conséquence est que les éléments contenus dans ~/.bashrc doivent être aussi légers (minimum) que possible afin de réduire les frais généraux lors du démarrage d'un shell non connecté.

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

9
Jonathan Leffler

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 avez insérés peuvent être votre chemin PATH et d’autres variables d’environnement importantes.

.bashrc est utilisé pour les shells non connectés. Je ne suis pas sûr de ce que cela signifie. Je sais que RedHat l'exécute chaque fois que vous démarrez un autre shell (par exemple, appelez à nouveau bash ou simplement bash). Vous voudrez peut-être y insérer des alias, mais 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 est changé pour permettre à d’autres coquillages (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… Vous voudrez peut-être arrêter les démons ou même faire un peu de ménage. Vous pouvez également ajouter "effacer" à cet endroit si vous souhaitez effacer l'écran lorsque vous vous déconnectez.

Il existe également un suivi complet de chacun des fichiers de configuration ici

Celles-ci sont probablement même dépendantes de la distro., 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.

7
Filip Ekberg

Selon Josh Staiger , le fichier Terminal.app de Mac OS X exécute 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 distincts pour les shells de connexion et de non-connexion. Lorsque vous définissez un PATH, vous souhaitez qu’il s’applique aux deux. Vous pouvez résoudre ce problème en recherchant dans .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

Désormais, lorsque vous vous connecterez à votre ordinateur à partir d’une console, le fichier .bashrc sera appelé.

4
Rose Perrone

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

2
PolyThinker

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

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

0
seismick