Comment Mac OS X définit-il la valeur de $ PATH?

11

J'ai une compréhension de base sur la façon dont $ PATH peut être défini, mais existe-t-il une documentation qui décrit entièrement où Mac OS obtient tous les chemins d'accès qui sont ajoutés à $ PATH? Je suis au courant des choses comme /etc/profile, /etc/pathset /etc/profile.d, mais y at - il d' autres scripts qui affectent éventuellement la valeur de $ PATH? Je ne suis pas non plus très familier entre les shells sans connexion et les shells de connexion ( .bashrc, .bash_profile), mais je suis conscient des différences de base.

Psycho Punch
la source

Réponses:

9

Habituellement, votre CHEMIN est défini par le shell. Pour Bash, tout est expliqué dans le manuel . Vous pouvez également ouvrir man bashet passer à la INVOCATIONpièce.

Appelé en tant que shell de connexion interactif, ou avec --login

Lorsque Bash est invoqué en tant que shell de connexion interactif, ou en tant que shell non interactif avec l'option --login, il lit et exécute d'abord les commandes du fichier / etc / profile, si ce fichier existe. Après avoir lu ce fichier, il recherche ~ / .bash_profile, ~ / .bash_login et ~ / .profile, dans cet ordre, et lit et exécute les commandes à partir du premier qui existe et est lisible.

Appelé comme un shell interactif sans connexion

Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, Bash lit et exécute des commandes à partir de ~ / .bashrc, si ce fichier existe. Dans OS X, en plus, il y a path_helperqui lit le contenu de /etc/paths.det l'ajoute à votre chemin.

La clé ici est que sous OS X, le terminal ouvre un shell de connexion par défaut, tandis que sous Linux, les shells sont généralement démarrés en tant que shells sans connexion. Josh Staiger a une bonne explication des shells de connexion vs non-login .

Donc, il n'y a essentiellement que ces deux trois où vous pouvez définir des chemins:

  • /etc/profile(qui appelle path_helper)
  • /etc/pathset /etc/paths.d(appelé de path_helper)
  • votre fichier de configuration shell ( .bash_profile)
slhck
la source
Merci pour la réponse concise et informative. Donc je suppose que je comprends en quelque sorte quels scripts / artefacts influencent alors $ PATH. Cela signifie-t-il donc que le /etc/profilescript est principalement utilisé par bash? Je n'ai pas d'expérience avec d'autres obus, mais je suppose qu'ils suivent une structure différente?
Psycho Punch du
Le /etc/profileest utilisé par la plupart (tous? Pas sûr à 100%) des obus. C'est pourquoi c'est un bon choix pour mettre des choses dans ce que vous voulez partout, comme des CHEMINS. Bash lit des .bash_fichiers tandis que Zsh par exemple lit .zshrcen plus des autres. Cela dépend de la coquille.
slhck
"Dans OS X, en plus, il y a path_helper qui lit le contenu de /etc/paths.d et les ajoute à votre chemin." Non, path_helpern'est pas appelé pour les shells interactifs sans connexion (ni les shells non interactifs). Il s'agit en /etc/profilefait de shells de connexion interactifs .
Maggyero
8

Les chemins d'accès /etc/pathset /etc/paths.d/*sont généralement ajoutés PATHpar path_helper . path_helperest exécuté à partir de /etc/profile, il est donc exécuté lorsque bash est appelé en tant que shell de connexion interactif, mais pas lorsque bash est appelé en tant que shell sans connexion ou shell non interactif.

/etc/pathscontient /usr/local/binà la fin par défaut et /etc/paths.d/est vide par défaut.

Terminal et iTerm 2 ouvrent de nouveaux shells en tant que shells de connexion par défaut, et le shell ouvert lorsque vous vous connectez à votre ordinateur est également un shell de connexion. De nombreux émulateurs de terminaux sur d'autres plates-formes tmuxet le mode shell dans Emacs ouvrent de nouveaux shells en tant que shells sans connexion.

J'ai ajouté cette ligne à /etc/launchd.conf:

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

Il change la valeur du PATHprocessus root launchd. La valeur est héritée par tous les autres processus, y compris les processus launchd par utilisateur. Vous pouvez appliquer des modifications /etc/launchd.confen redémarrant ou en exécutant launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confet relançant des processus.

Sous OS X, ~/.profilen'est pas lu lorsque vous vous connectez graphiquement. Si les deux ~/.bash_profileet ~/.profileexistent, bash ne lit pas non ~/.profileplus.

~/.MacOSX/environment.plist a cessé de fonctionner en 10.8.

Lri
la source