web-dev-qa-db-fra.com

Différence entre .bashrc et .bash_profile

Quelle est la différence entre .bashrc et .bash_profile et lequel dois-je utiliser?

434
cfischer

Traditionnellement, lorsque vous vous connectez à un système Unix, le système lance un programme pour vous. Ce programme est un shell, c’est-à-dire un programme conçu pour lancer d’autres programmes. C'est un shell en ligne de commande: vous démarrez un autre programme en tapant son nom. Le shell par défaut, un shell Bourne, lit les commandes à partir de ~/.profile lorsqu’il est appelé en tant que shell de connexion.

Bash est un shell Bourne-like. Il lit les commandes de ~/.bash_profile lorsqu’il est appelé en tant que shell de connexion. Si ce fichier n’existe pas¹, il essaie plutôt de lire ~/.profile.

Vous pouvez appeler un shell directement à tout moment, par exemple en lançant un émulateur de terminal dans un environnement graphique. Si le shell n'est pas un shell de connexion, il ne lit pas ~/.profile. Lorsque vous démarrez bash en tant que shell interactif (c'est-à-dire pour ne pas exécuter de script), il lit ~/.bashrc (sauf lorsqu'il est appelé en tant que shell de connexion, il ne lit que ~/.bash_profile ou ~/.profile.

Donc:

  • ~/.profile est l'endroit où placer les éléments qui s'appliquent à l'ensemble de votre session, tels que les programmes que vous souhaitez démarrer lorsque vous vous connectez (mais pas les programmes graphiques, ils vont dans un fichier différent) et les définitions de variable d'environnement.

  • ~/.bashrc est l'endroit où placer les éléments qui s'appliquent uniquement à bash, tels que les définitions d'alias et de fonctions, les options du shell et les paramètres d'invite. (Vous pouvez aussi y mettre des raccourcis clavier, mais pour bash, ils vont normalement dans ~/.inputrc.)

  • ~/.bash_profile peut être utilisé à la place de ~/.profile, mais il est lu uniquement par bash, et non par un autre shell. (Ceci est principalement une préoccupation si vous voulez que vos fichiers d'initialisation fonctionnent sur plusieurs machines et que votre shell de connexion ne les traite pas toutes.) C'est un endroit logique pour inclure ~/.bashrc si le shell est interactif. Je recommande le contenu suivant dans ~/.bash_profile:

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
    

Sur les ordinateurs de bureau modernes, il existe une complication supplémentaire liée à ~/.profile. Si vous vous connectez dans un environnement graphique (c'est-à-dire si le programme dans lequel vous tapez votre mot de passe s'exécute en mode graphique), vous n'obtenez pas automatiquement un shell de connexion qui se lit ~/.profile. En fonction du programme de connexion graphique, du gestionnaire de fenêtres ou de l'environnement de bureau que vous exécutez par la suite, et de la manière dont votre distribution a configuré ces programmes, votre ~/.profile peut ou non être lu. Si ce n'est pas le cas, il existe généralement un autre endroit où vous pouvez définir des variables d'environnement et des programmes à lancer lorsque vous vous connectez, mais il n'existe malheureusement pas d'emplacement standard.

Notez que vous pouvez voir ici et là des recommandations pour mettre les définitions de variable d’environnement dans ~/.bashrc ou toujours lancer des shells de connexion dans les terminaux. Les deux sont de mauvaises idées. Le problème le plus courant avec l'une ou l'autre de ces idées est que vos variables d'environnement ne seront définies que dans des programmes lancés via le terminal, et non dans des programmes lancés directement avec une icône, un menu ou un raccourci clavier.

¹ Pour être complet, à la demande: si .bash_profile n'existe pas, bash essaye également .bash_login avant de revenir à .profile. N'hésitez pas à oublier que cela existe.

503
Gilles

De cet article court article

Selon la page de manuel bash, .bash_profile est exécuté pour les shells de connexion, alors que .bashrc est exécuté pour les shells interactifs autres que ceux de connexion.

Qu'est-ce qu'un shell avec ou sans login?

Lorsque vous vous connectez (par exemple, tapez nom d'utilisateur et mot de passe) via la console, soit physiquement assis sur la machine lors du démarrage, soit à distance via ssh:.

Mais, si vous êtes déjà connecté à votre ordinateur et ouvrez une nouvelle fenêtre de terminal (xterm) dans Gnome ou KDE, alors .bashrc est exécuté avant la commande de fenêtre Invite. .bashrc est également exécuté lorsque vous démarrez une nouvelle instance bash en tapant/bin/bash dans un terminal.

52
Jarvin

Autrefois, quand les pseudo-billets n'étaient pas pseudo et en fait, les dactylographes et UNIX étaient accédés par des modems si lents que vous pouviez voir chaque lettre en train d'être imprimée sur votre écran, l'efficacité était primordiale. Pour améliorer quelque peu l'efficacité, vous avez eu l'idée d'une fenêtre de connexion principale et de toutes les autres fenêtres avec lesquelles vous travailliez réellement. Dans votre fenêtre principale, vous souhaitez recevoir des notifications pour tout nouveau courrier, éventuellement exécuter d’autres programmes en arrière-plan.

Pour supporter cela, les shells ont créé un fichier .profile spécifiquement sur les "shells de connexion". Cela ferait la spéciale, une fois une session de configuration. Bash a étendu cela un peu en regardant d'abord .bash_profile avant .profile. Ainsi, vous ne pouvez enregistrer que des choses là-dedans (pour ne pas bousiller Bourne Shell, etc., qui ont également regardé .profile). D'autres shells, non connectés, ne font que créer le fichier rc, .bashrc (ou .kshrc, etc.).

C'est un peu un anachronisme maintenant. Vous ne vous connectez pas à un shell principal autant que vous vous connectez à un gestionnaire de fenêtres gui. Il n'y a pas de fenêtre principale différente des autres fenêtres.

Ma suggestion - ne vous inquiétez pas de cette différence, elle est basée sur un style plus ancien d’utilisation de Unix. Éliminez la différence dans vos fichiers. Le contenu entier de .bash_profile devrait être:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

Et mettez tout ce que vous voulez réellement mettre en .bashrc

Rappelez-vous que .bashrc provient de tous les shells, interactif et non interactif. Vous pouvez court-circuiter le sourcing pour les shells non interactifs en plaçant ce code près du sommet de .bashrc:

[[ $- != *i* ]] && return

35
Rich Homolka

Jetez un coup d'œil à cet excellent article de ShreevatsaR sur le blog . Voici un extrait, mais consultez l'article du blog, qui inclut une explication de termes tels que "login Shell", un organigramme et un tableau similaire pour Zsh.

Pour Bash, ils fonctionnent comme suit. Lisez la colonne appropriée. Exécute A, puis B, puis C, etc. B1, B2, B3 signifie qu’il n’exécute que le premier des fichiers trouvés.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+
17
Flimm

UN MEILLEUR COMMENTAIRE POUR LE HEAD OF/ETC/PROFILE

S'appuyant sur l'excellente réponse de Flimm ci-dessus, j'ai inséré ce nouveau commentaire à la tête de mon/Debian/etc/profile, (vous devrez peut-être l'adapter à votre distribution.) :

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

Et cette note en tête de chacun des autres fichiers d'installation pour s'y référer:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

À noter, je pense que le fichier/etc/profile de Debian par défaut (inclut) /etc/bash.bashrc (c’est à ce moment-là que /etc/bash.bashrc existe). Les scripts de connexion lisent donc les deux fichiers/etc, alors que les non-utilisateurs ne lisent que bash.bashrc.

A noter également que /etc/bash.bashrc est configuré pour ne rien faire s'il n'est pas exécuté de manière interactive. Ces deux fichiers ne sont donc que pour des scripts interactifs.

4
Elliptical view