538 votes

Différence entre .bashrc et .bash_profile

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

3 votes

1 votes

Si vous voulez une explication plus complète qui implique également .profile Jetez un coup d'œil à cette question : superuser.com/questions/789448/

0 votes

Cette réponse couvre également certains aspects stackoverflow.com/questions/415403/

62voto

Jarvin Points 6998

De ce article court

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

Qu'est-ce qu'un Shell de login ou de non-login ?

Lorsque vous vous connectez (ex : tapez le nom d'utilisateur et le mot de passe) via la console, soit en étant physiquement assis devant la machine lorsque ou à distance via ssh : .bash_profile est exécuté pour configurer les choses les choses avant l'invite de commande initiale. initiale.

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

16 votes

Légères mises à jour : "Exécuté" est probablement un terme un peu trompeur, les deux sont des sources. Exécuté semble être exécuté comme un script, fork/exec yadda yadda. Il est exécuté dans le contexte du script actuel. Plus important encore, .bashrc est exécuté beaucoup plus souvent. Il est lancé à chaque script bash exécuté, et aussi si vous n'avez pas de .bash_profile. De plus, selon la façon dont vous avez configuré votre xterms, vous pouvez créer un script qui source .bash_profile

0 votes

@RichHomolka `Il (~/.bashrc) est exécuté sur chaque bash script exécuté` n'est pas vrai. Par défaut, ~/.bashrc est invoqué uniquement pour interactive shells non-login, et donc, ne sera pas sourcé dans un script.

45voto

Lark Points 1640

À l'époque où les pseudo-types n'étaient pas des pseudo-types et où l'on tapait réellement, et où l'on accédait aux UNIX par des modems si lents que l'on pouvait voir chaque lettre s'imprimer sur l'écran, l'efficacité était primordiale. Pour améliorer quelque peu l'efficacité, vous aviez le concept d'une fenêtre de connexion principale et de toutes les autres fenêtres que vous utilisiez pour travailler. Dans votre fenêtre principale, vous souhaitiez recevoir des notifications pour tout nouveau courrier, et éventuellement exécuter d'autres programmes en arrière-plan.

Pour cela, les shells ont sourcé un fichier .profile spécifiquement sur les "shells de connexion". Ceci ferait le spécial, une fois la session configurée. Bash a quelque peu étendu cela en regardant d'abord .bash_profile avant .profile, de cette façon vous pouvez mettre des choses uniquement bash là-dedans (afin qu'elles ne bousillent pas Bourne Shell, etc, qui regardait aussi .profile). Les autres shells, non-login, seraient juste la source du 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être gui. Il n'y a pas de fenêtre principale différente de n'importe quelle autre fenêtre.

Ma suggestion - ne vous inquiétez pas de cette différence, elle est basée sur un ancien style d'utilisation d'Unix. Eliminez 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 définir dans .bashrc

N'oubliez pas que le fichier .bashrc est utilisé comme source pour tous les shells, interactifs ou non. Vous pouvez court-circuiter le sourcing pour les shells non interactifs en plaçant ce code en haut du fichier .bashrc :

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

6 votes

C'est une mauvaise idée, voir ma réponse . En particulier, vos variables d'environnement ne seront définies que dans les programmes lancés via le terminal, et non dans les programmes lancés directement par une icône, un menu ou un raccourci clavier.

6 votes

@Gilles Je ne comprends pas pourquoi vous affirmez cela. Avec .$HOME/.bashrc comme Rich l'a montré ci-dessus, les paramètres dans .bashrc sera disponible dans les shells de connexion, et donc dans l'environnement de bureau également. Par exemple, sur mon système Fedora, gnome-session est lancé en tant que -$SHELL -c gnome-session donc .profile est lu.

2 votes

@PiotrDobrogost Oh, oui, il y a un autre problème avec la réponse de Rich. Y compris .bashrc en .profile ne fonctionne généralement pas, car .profile peut être exécuté par /bin/sh et non bash (par exemple sur Ubuntu pour une connexion graphique par défaut), et que Shell peut ne pas être interactif (par exemple pour une connexion graphique).

25voto

Flimm Points 9047

Jetez un coup d'œil à ceci excellent blog post par ShreevatsaR . Voici un extrait, mais allez voir l'article du blog, il comprend une explication pour des termes comme "login Shell", un organigramme, et un tableau similaire pour Zsh.

Pour Bash, ils fonctionnent comme suit. Lisez la colonne appropriée vers le bas. Exécute A, puis B, puis C, etc. Le B1, B2, B3 signifie qu'il n'exécute que le premier de ces 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      |           |      |
+----------------+-----------+-----------+------+

0 votes

Plutôt que d'afficher la même réponse à plusieurs questions, il est préférable que vous puissiez adapter votre réponse aux besoins spécifiques de l'auteur de la question. Si la réponse est exactement la même pour les deux questions, vous devriez poster une seule réponse et voter pour fermer les autres questions en tant que doublons de l'original.

1 votes

@Mokubai L'autre question a déjà été marquée comme un doublon de celle-ci.

0 votes

@ElipticalView : par set to do nothing, vous faites référence à la ligne : [ -z "$PS1" ] && return ? Le tableau dans ma réponse donne la liste des scripts exécutés par Bash indépendamment du contenu du scripts, si le scripts lui-même a la ligne [ -z "$PS1" ] && return bien sûr, cela prendrait effet, mais je ne pense pas que cela devrait signifier que je devrais changer la

9voto

Elliptical view Points 1060

UN MEILLEUR COMMENTAIRE POUR L'EN-TÊTE DE /ETC/PROFILE

En me basant sur l'excellente réponse de Flimm ci-dessus, j'ai inséré ce nouveau commentaire en tête de ma Debian /etc/profile , (vous devrez peut-être l'ajuster pour votre distro). :

# 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 de configuration pour y faire référence :

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

Il est intéressant de noter que la version de Debian /etc/profile sources par défaut (inclus) /etc/bash.bashrc (c'est quand /etc/bash.bashrc existe). Ainsi, les scripts de connexion lisent les deux /etc tandis que les non-login ne lisent que bash.bashrc.

Il convient également de noter que /etc/bash.bashrc est configuré pour ne rien faire lorsqu'il n'est pas exécuté de manière interactive. Donc ces deux fichiers sont seulement pour les scripts interactifs.

8voto

MarcH Points 302

La logique de configuration de bash elle-même n'est pas follement compliquée et est expliquée dans d'autres réponses dans cette page, sur serverfault et dans de nombreux blogs. Le problème est cependant le suivant ce que les distributions Linux font de bash Je parle de la manière complexe et variée dont ils configurent bash par défaut. http://mywiki.wooledge.org/DotFiles mentionne brièvement certaines de ces bizarreries. Voici un exemple de trace sur Fedora 29, qui montre quels fichiers sont à l'origine de quel(s) autre(s) fichier(s) et dans quel ordre pour un scénario très simple : se connecter à distance avec ssh et ensuite démarrer un autre sous-shell :

ssh fedora29
  -bash # login shell
       /etc/profile
      |     /etc/profile.d/*.sh
      |     /etc/profile.d/sh.local
      |     /etc/bashrc
       ~/.bash_profile
      |     ~/.bashrc
      |           /etc/bashrc
      |
      |
       $ bash  # non-login shell
             ~/.bashrc
                  /etc/bashrc
                        /etc/profile.d/*.sh

La logique la plus complexe de Fedora se trouve dans /etc/bashrc . Comme on l'a vu plus haut /etc/bashrc est un fichier que bash lui-même ne connaît pas, je veux dire pas directement. Le système de Fedora /etc/bashrc teste si :

  • il est sourcé par un login Shell,
  • il est fourni par un Shell interactif,
  • il a déjà été sourcé

... et fait ensuite des choses complètement différentes en fonction de celles-ci.

Si vous pensez pouvoir vous souvenir du graphique ci-dessus, alors tant pis car c'est loin d'être suffisant : ce graphique ne décrit qu'un seul scénario, des choses légèrement différentes se produisent lors de l'exécution de scripts non interactifs ou lors du démarrage d'une session graphique. J'ai omis ~/.profile . J'ai omis bash_completion scripts. Pour des raisons de compatibilité ascendante, invoquer bash en tant que /bin/sh au lieu de /bin/bash modifie son comportement. Qu'en est-il de zsh et des autres shells ? Et bien sûr, les différentes distributions de Linux font les choses différemment, par exemple Debian et Ubuntu sont livrés avec une version non standard de bas h, il a une ou plusieurs personnalisations spécifiques à Debian. Il recherche notamment un fichier inhabituel : /etc/bash.bashrc . Même si vous vous en tenez à une seule distribution Linux, elle évolue probablement au fil du temps. Attendez : nous n'avons même pas touché à macOS, FreeBSD, ... Enfin, ayons une pensée pour les utilisateurs coincés par les façons encore plus créatives dont leurs administrateurs ont configuré le système qu'ils doivent utiliser.

Comme le montre le flot incessant de discussions sur ce sujet, c'est une cause perdue. Tant que vous souhaitez simplement ajouter de nouvelles valeurs, quelques "essais et erreurs" suffisent généralement. Le vrai plaisir commence lorsque vous voulez modifier dans un fichier (utilisateur) quelque chose de déjà défini dans un autre (dans /etc). Préparez-vous alors à passer du temps à développer une solution qui ne sera jamais portable.

Pour une dernière partie de plaisir, voici le "graphique source" pour le même scénario simple sur Clear Linux en juin 2019 :

ssh clearlinux
  -bash # login shell
       /usr/share/defaults/etc/profile
      |     /usr/share/defaults/etc/profile.d/*
      |     /etc/profile.d/*
      |     /etc/profile
       ~/.bash_profile
      |
      |
        $ bash   # non-login shell
            /usr/share/defaults/etc/bash.bashrc
           |       /usr/share/defaults/etc/profile
           |      |     /usr/share/defaults/etc/profile.d/*
           |      |     /etc/profile.d/*
           |      |     /etc/profile
           |       /etc/profile
            ~/.bashrc

1 votes

Le cas de l'initialisation du démarrage de Linux Shell et gdm est une collection épique d'anti-modèles, de dysfonctionnements et de mauvais comportements. Je travaille dans ces environnements depuis de nombreuses années et j'ai toujours été surpris de constater à quel point ce cadre est négligent, irréfléchi, non adapté au cas d'utilisation le plus profond de la personnalisation fiable et reproductible de l'environnement. Néanmoins, je suis très reconnaissant à tous les contributeurs, à grande échelle, Linux reste le meilleur environnement pour beaucoup, sinon la majorité des professionnels de l'informatique.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X