web-dev-qa-db-fra.com

Pourquoi .profile (et non pas .bashrc) ajoute ~ / bin au chemin?

Puisque .bashrc est plus "générique" (en ce sens que .profile le trouve), pourquoi la procédure "include ~/bin to path" n'est pas à l'intérieur de .bashrc? Pourquoi l'utilisateur ne le voudrait-il pas dans un shell sans connexion? (Surtout de nos jours, où les shells non connectés sont plus communs *.)

Je sais que je peux faire manuellement un tel changement, mais je veux savoir s'il y a une raison.

* Je ne peux pas le prouver, mais je pense que c'est le cas.

9
borges

~/.bashrc et /etc/bash.bashrc sont exécutés à chaque démarrage d'un shell bash interactif.

En revanche, ~/.profile et /etc/profile sont exécutés à chaque fois que login Shell est démarré. Ainsi, il ne doit pas nécessairement s'agir d'un shell bash, mais d'un shell de connexion (et de nombreuses instances de shell bash ne sont pas shell de connexion).

  • Un shell bash est un shell dans lequel le programme Shell qui le fournit est bash , plutôt que d'autres programmes, tels que dash .
  • Un shell de connexion est un shell qui est démarré automatiquement à la suite de la connexion afin de fournir l'interface utilisateur (graphique ou en ligne de commande) pour la connexion. Lorsqu'un shell de connexion est quitté, le login se termine.

Par conséquent, placer une recommandation qui ajoute des entrées à PATH dans un fichier bashrc aurait pour effet:

  1. Ne faites rien lorsque le shell n'est pas bash, ce qui est souvent le cas. Par exemple, PATH ne serait pas modifié lorsque vous vous connectez à une session de connexion graphique. N'oubliez pas que PATH n'est pas utilisé uniquement par les programmes en ligne de commande.

  2. Ajoutez-le encore et encore en présence de shells imbriqués bash. Ainsi, si vous démarrez un shell dans un shell - ce qui est très courant pour diverses raisons -, vous aurez plusieurs entrées ~/bin empilées sur votre PATH. Cela rend la variable d'environnement PATH difficile à lire et diminue parfois les performances.

Ce serait indésirable. Ainsi, il serait mauvais de mettre cela dans un fichier bashrc; il appartient vraiment à ~/.profile. ~/.profile est le bon endroit ​​pour:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Les shells autres que de connexion ont des shells de connexion (ou quelque chose qui se comporte comme un shell de connexion) en tant que parent et héritent de la plupart de leurs variables d'environnement, y compris PATH, de ce shell de connexion. Donc, mettre des commandes de modification de chemin dans ~/.profile nécessite que vous vous déconnectiez et vous reconnectiez pour qu'elles soient efficaces, mais cela affecte également l'environnement des shells non connectés (ainsi que celui des programmes qui ne sont pas des shells, puisque chaque programme obtient son propre ensemble de variables d’environnement - appelé son "environnement" - hérité de son processus parent).

13
Eliah Kagan

C'est parce que traditionnellement les variables d'environnement vont seulement dans /etc/profile ou .profile. Le fichier bashrc contient des éléments tels que des alias, des paramètres d'invite, des options de shell, etc. (c'est-à-dire des éléments directement liés au shell).

3
teppic