Vue complète de l'endroit où la variable PATH est définie dans bash

17

J'ai lu à quelques endroits que le PATHest défini dans /etc/profileou le .profilefichier qui se trouve dans le répertoire d'accueil.

S'agit-il des seuls endroits où le chemin est défini? Je veux mieux le comprendre.

Dans le /etc/profiledossier, comme le dit le commentaire suivant "system-wide .profile file for the Bourne shell". Est-ce à dire que les fichiers de profil sont les principaux fichiers de configuration de bash?

Dans ce fichier, je ne vois pas du tout la PATHvar définie. Dans le .profilefichier du répertoire personnel, il y a cette ligne:

PATH="$HOME/bin:$PATH"

Cela réinitialise PATHpar l'apparence, car il concatène la $PATHchaîne déjà définie avec le $HOME/bin:droit? Mais si etc/profileet ~/.profilesont les seuls paramètres de fichiers d' PATH$PATHvient cette ligne de code si elle n'est pas définie dans /etc/profile?

Une personne expérimentée peut-elle donner une explication large et détaillée de la PATHvariable? Merci!

Larry Lawless
la source

Réponses:

20

Il existe de nombreux endroits où vous PATHpouvez définir.

Le loginprogramme le définit sur une valeur par défaut. La configuration de cette valeur par défaut dépend du système. Sur la plupart des systèmes Linux non intégrés, il provient de /etc/login.defs, avec des valeurs différentes pour root et pour les autres utilisateurs. Consultez le login(1)manuel de votre système pour savoir ce qu'il fait.

Sur les systèmes utilisant PAM , en particulier le pam_envmodule, les variables d'environnement peuvent être définies dans le fichier à l'échelle du système /etc/environmentet le fichier par utilisateur ~/.pam_environment.

Ensuite, la plupart des façons de se connecter (mais pas les tâches cron) exécutent un shell de connexion qui lit les fichiers de configuration à l'échelle du système et par utilisateur. Ces fichiers peuvent modifier la valeur de PATH, généralement pour ajouter des entrées, mais parfois d'une autre manière. Les fichiers lus dépendent du shell de connexion. Les coquilles de style Bourne / POSIX lisent /etc/profileet ~/.profile. Bash lit /etc/profile, mais pour le fichier par utilisateur, il ne lit que le premier fichier existant parmi ~/.bash_profile, ~/.bash_loginet ~/.profile. Zsh lit /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zloginet ~/.zlogin. De nombreuses sessions GUI s'arrangent pour se charger /etc/profileet ~/.profile, mais cela dépend du gestionnaire d'affichage, de l'environnement de bureau ou d'un autre script de démarrage de session, et de la façon dont chaque distribution les a configurés.

Gilles 'SO- arrête d'être méchant'
la source
4

La variable PATH initiale est généralement définie dans /etc/profile Parfois, un administrateur sys mettra également les variables PATH à la source dans/etc/profile.d

Ce sont les vars du système PATH que tous ceux qui se connectent héritent par défaut (sauf s'ils sont remplacés localement). Cela définit généralement des chemins évidents, comme /usr/bin, bien que dans mon travail, nous utilisons /optet quelques emplacements personnalisés de manière extensive, donc ceux-ci sont également définis.

Sur les comptes de connexion par utilisateur, PATH peut également être défini dans ~/.profile. Cela pourrait définir des choses auxquelles tous les utilisateurs n'ont pas accès; peut-être que les chefs de service peuvent exécuter des binaires à partir de /optmais les autres utilisateurs ne sont pas gênés par ces binaires. Les utilisateurs peuvent également modifier ce fichier eux-mêmes, et ce .profilequi est bien, c'est qu'il n'est pas spécifique au shell; si vous vous connectez, l'ensemble PATH y est obtenu.

Pour les connexions spécifiques shell, PATH peut être définie ~/.bash_profile, ~/.bashrcou .cshrc, ou similaire. Les utilisateurs peuvent définir PATH ici s'ils veulent des chemins spécifiques pour des shells spécifiques, ou s'ils se trouvent simplement à y conserver toutes leurs préférences personnelles.

En résumé: / etc / profile et /etc/profile.d sont traditionnellement des paramètres en cascade; ils sont hérités et sont généralement ajoutés à des fichiers dot personnels (bien qu'un utilisateur puisse choisir de les remplacer à la place). Les fichiers de points personnels sont généralement définis par un utilisateur.

Bien sûr, un shell a aussi des variables d'environnement, donc une variable d'environnement locale peut également ajouter ou remplacer le PATH par défaut dans n'importe lequel des fichiers de configuration.

Klaatu von Schlacker
la source
Je viens de vérifier tous ces fichiers que vous avez mentionnés, ~ / .bash_profile et .cshrc n'existent cependant pas. Les 3 fichiers de script dans le répertoire /etc/profile.d: appmenu-qt5.sh, bash_completion.sh & vte.sh ne définissent pas non plus la variable PATH. Que voulez-vous dire par «un shell a aussi des variables d'environnement» est le PATH par défaut défini dans le programme binaire / bin / bash? Lorsque je fais écho au terminal $ PATH, j'obtiens: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games mais je ne sais pas vraiment où tout se passe.
Larry Lawless
Je pense que j'ai mal lu votre question, je pensais que vous demandiez tous les emplacements où PATH pourrait être défini, mais je pense que vous êtes plus intéressé par où PATH est initialement défini. Pour cela, regardez /etc/bashrc. Cela détermine comment BASH est lancé, qui doit inclure toutes les variables d'environnement initiales. Sur mon système, /etc/bashrclit à partir de /etc/profile.dmais il semble que vous n'ayez que 3 fichiers /etc/profile.d, votre distribution peut donc le faire différemment.
Klaatu von Schlacker
1
Je veux essentiellement en connaître les tenants et les aboutissants. J'aimerais que Ken Thompson soit mon père :)
Larry Lawless
Vous y arriverez. Croyez-moi, après avoir utilisé ces trucs quotidiennement pendant un certain temps, tout commence à couler, et tant que vous continuez à demander "pourquoi?" et en lisant des documents pour les réponses, vous finissez par apprendre beaucoup!
Klaatu von Schlacker
Dans Linux Mint 18 Cinnamon, assurez-vous de vérifier /etc/profile.d/jdk_home.sh J'ai renommé ce fichier en jdk_home.sh.old et maintenant mon chemin ne continue pas d'être remplacé et je peux appeler java -version et voir Java 9 comme attendu. Même si j'ai correctement sélectionné Java 9 dans update-aternatives --config java, ce fichier jdk_home.sh a continué à remplacer le $ PATH
flyingdrifter
3

Pour ajouter aux autres réponses:

bashsera défini PATHsur une valeur par défaut codée en dur s'il n'est pas défini dans l'environnement. Sur une machine Ubuntu Server 16.04.2, j'obtiens:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Nous pouvons vérifier que cette valeur est bien codée en dur, et non lue depuis l'environnement ou un fichier, en utilisant l' stringsutilitaire:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Cependant, j'obtiens un résultat différent sur ma machine Arch Linux:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Il semble donc que cette valeur par défaut soit choisie au moment de la construction du bashbinaire, ce qui dépend du système d'exploitation / de la distribution utilisé.

Vladimir Panteleev
la source
0

Des trucs que je ne vois pas:

  • X stuff
  • Masterfiles d'où .profileetc sont copiés lors de la création du compte
  • pam_env
  • Un sujet récent sur Debian , où cela est discuté en détail.

Quant à Ken Thompson, vous serez peut-être surpris de son: "Vues sur Linux" .

Rusi
la source