.bashrc et .bash_profile, quelle différence ?
I. Présentation
Vous vous êtes sûrement déjà posé la question, dans chaque "/home/" utilisateur, plusieurs fichiers cachés (commençant par un ".") peuvent être trouvés. Parmi eux, ".bashrc" et ".bash_profile". Vous avez peut être eu vent que ces deux scripts sont exécutés au démarrage d'une session, mais quelle est leur différence réelle ? C'est ce que nous allons voir dans cet article.
D'une manière général, deux contextes d'exécution sont à imaginer quand on indique qu'ils sont exécutés au démarrage de chaque session :
- Le démarrage d'une nouvelle session sur une machine
- Le démarrage d'un nouveau shell
Vous vous en doutez, ces deux contextes d'exécution ont quelque chose à voir dans la différence entre .bash_profile et .bashrc
II. .bash_profile et .bashrc
Le fichier .bash_profile est exécuté pour les login shell, c'est à dire là où vous saisissez votre login et mot de passe. C'est par exemple le cas lors de votre première connexion au démarrage de votre machine ou lors d'une connexion SSH.
Un login shell est le premier processus qui est exécuté avec l'ID de votre utilisateur. Dans ce contexte, c'est le fichier bash_profile qui est exécuté.
Le fichier .bashrc est exécuté lors du lancement d'un non-login shell, par exemple lorsque vous ouvrez un nouveau shell dans votre machine alors que vous y êtes déjà authentifié, typiquement un nouveau terminal sur votre bureau.
Vous l'aurez compris, le fichier .bashrc est exécuté bien plus souvent que le fichier .bash_profile
Un contexte ou cette différence est utile pour que vous vous rendiez compte de l'importance de ce détail. Si vous souhaitez que votre machine affiche un message à chaque fois que vous vous connectez (en local ou à distance), vous utiliserez le fichier .bash_profile. Si vous indiquz votre message dans le fichier .bashrc, ce message apparaîtra à chaque fois que vous démarrerez un nouveau shell, et ce n'est pas ce qui est souhaité.
Il est important de signaler que, par défaut, le fichier .bash_profile contient l'instruction suivante :
if [ -f ~/.bashrc ]; then source ~/.bashrc fi
Cela signifie que, lors du lancement du .bash_profile après l'ouverte d'un login-shell, le fichier .bashrc est exécuté. Attention car l'inverse n'est pas vrai, sinon tout cela n'aurait aucun intérêt.
Également si vous utilisez un script de lancement (type /etc/init.d/script start) pour lancer un service sous le nom d'un autre utilisateur, alors le login et le mot de passe de cet utilisateur n'est pas demandé, il s'agit donc d'un non-login shell et seul le .bashrc est exécuté. Même chose pour les changement d'utilisateur de type "su username" depuis root 😉
Cette différence est importante. Dernièrement, j'ai eu à mettre à jour une variable d'environnement d'un service utilisant les fichiers .bashrc et .bash_profile pour la variabilisation de la version de l'instance utilisée. Lorsque le compte de service était utilisé pour le lancement d'un service, seul le fichier .bashrc était exécuté, la modification du .bash_profile n'aurait rien donné et j'aurai pu passer plusieurs heures sur ce problème 🙂
J'espère que cette petite info vous aura été utile, n'hésitez pas à partager vos astuces à ce sujet dans les commentaires.
Bonjour,
Merci pour cette information bien détaillée et qui m’a servi.