Dans Mountain Lion, comment définir, en un seul endroit, la variable d'environnement PATH pour toutes les applications nouvellement lancées?


9

Sur Ask Different, il existe de nombreuses questions concernant la PATHvariable d'environnement et comment la définir pour les applications lancées par un shell, par les projecteurs ou via le Finder (questions typiques: comment définir PATH pour les applications lancées par le Finder ou comment changer la variable d'environnement PATH. .. ).

Les réponses vont de shscripts de démarrage à /etc/pathsla /etc/launchd.conf. Me voici après la réponse pour un paramètre unifié de PATHtoutes les applications sous Mac OS X Mountain Lion 10.8.2.

Réponses:


14

Après de nombreux essais avec différentes options, je conclus:

Existe-t-il un moyen unifié de définir les PATHapplications lancées par différents moyens (comme le script shell, le Finder et Spotlight)? Eh bien, oui et non:

  • Non : la configuration PATHdes scripts de démarrage du shell (par exemple .bashrc) ne fonctionne que pour les applications lancées par des shells.
  • Non : La configuration PATHdu launchdprocessus actuel via launchctl setenv PATH <...>ne fonctionne pas du tout pour moi.
  • Oui : Mise PATHen /etc/launchd.conf(et le redémarrage du système) rendra le approprié PATHvisible dans les applications lancées par Spotlight, Dock et Finder, puis coquilles (locales).
  • Non : les shells appelés à distance n'héritent pas de l'environnement. (Voir ... pourquoi les shells distants via ssh n'héritent pas de l'environnement .. )

Notes pour la mise en place des coques:

  1. Pour un fonctionnement correct dans les shells locaux , il est important de désactiver l'utilisation de /usr/libexec/path_helper, car les chemins par défaut dans /etc/pathspeuvent changer l'ordre des chemins dans PATH. **

  2. Pour prendre en charge les shells distants , vous devez réimporter l' launchdenvironnement dans le shell. Utilisez quelque chose comme ça dans votre .bashrc:

# the vexatious path stuff
eval $(launchctl export)

Les conséquences malheureuses de l'ensemble du problème sont:

  • Aucun moyen d'avoir ces paramètres unifiés par utilisateur. ( ~/.launchd.confne fonctionne pas.)
  • Pas de moyen facile de construire le PATH à partir de différentes sources en utilisant des techniques comme l'expansion du répertoire personnel et al.

Mise à jour: La définition de PATH via /etc/launch.confne fonctionne pas pour les shells connectés à distance via ssh (je suppose que le sshdne transmet pas son environnement dont il hérite de son parent launchdau shell enfant.). - Je modifierai la réponse en conséquence.
halloleo

Réponse mise à jour avec une solution pour les shells distants.
halloleo

1
Très bonne réponse; Vous pouvez simplifier l' approvisionnement de l'environnement launchd comme suit: eval "$(launchctl export)".
mklement0

Un moyen facile d'éditer /etc/launchd.confest d'exécuter simplement sudo -e /etc/launchd.conf(si vous connaissez vi) ou EDITOR=nano sudo -e /etc/launchd.conf(si vous préférez un éditeur non modal).
nohillside

3

En développant la réponse précédente , pour modifier le chemin d'accès /etc/launchd.conf, vous devrez procéder comme suit.

  1. Assurez-vous que vous disposez des privilèges d'administrateur.

  2. Créez un nouveau fichier texte avec le contenu suivant, modifié en fonction de vos besoins:

    setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/Users/YourUserName/bin
    
  3. Enregistrez-le dans votre répertoire personnel sous launchd.conf.

  4. Ouvrez Terminal.app (ou votre substitut préféré) et tapez:

    sudo mv ~/launchd.conf /etc

    En fonction de votre utilisation précédente de la sudocommande, vous pouvez obtenir un court message "faites attention à ce que vous faites", mais dans les deux cas, vous devrez entrer votre mot de passe. La commande ne fait que déplacer le fichier dans le /etcrépertoire, qui n'est pas directement accessible lors de l'enregistrement d'un fichier dans TextEdit, par exemple. sudo(abréviation de "Super User DO") est utilisé car les privilèges d'administrateur sont nécessaires pour écrire dans ce répertoire.

  5. Redémarrez votre ordinateur.

Et vous devriez être prêt. Bonne chance!


Merci pour les détails, mais la question n'était pas de savoir comment modifier launchd.conf, mais plutôt comment toutes les applications obtiennent la même variable PATH de manière unifiée.
halloleo

D'accord, mais à l'origine, j'ai cherché la question en essayant de comprendre comment définir le PATHpour mes applications GUI, et j'ai pensé que j'aiderais les pauvres âmes qui ne sauraient pas comment effectuer le changement ...
MattDMo

Vous avez un point valable ici; Pourtant, je pense que l' intégration de vos informations dans la réponse est la meilleure option. - Je pense que ce fil de commentaires devient une méta-discussion, donc je l'ai ouvert sur meta.stackoverflow comme Que faire avec une réponse supplémentaire ...
halloleo

1
en fait, cela n'aurait-il pas dû être sur meta.apple.stackexchange.com?
MattDMo

En effet, meta.apple.stackexchange.com aurait été le bon endroit. Je ne savais tout simplement pas qu'il existe ...
halloleo

-2

Vous pouvez essayer https://github.com/ersiner/osx-env-sync .

Il gère à la fois la ligne de commande et les applications GUI à partir d'une seule source . Et cela fonctionne avec la dernière version de Mac OS X (Yosemite).


Ce qui automatise simplement l'autre réponse en utilisant le bit qui, selon lui, ne fonctionne pas, par exemple launchctl setenv PATH <...>
user151019

@Mark Cela n'a rien à voir avec l'automatisation des étapes d'une réponse ici. Celui-ci utilise un agent de lancement. Je vous suggère de l'essayer.
Ersin Er

La solution acceptée utilise également le launchdsystème. Votre solution présente les mêmes problèmes que ceux indiqués dans la réponse acceptée.
halloleo

@halloleo L'avez-vous réellement essayé? Et sur quelle version d'OS X?
Ersin Er
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.