Définition des variables d'environnement dans OS X pour les applications GUI

Comment est-ce que l'on configure des variables d'environnement dans Mac OS X de sorte qu'elles soient disponibles pour les applications GUI sans utiliser ~ / .MacOSX / environment.plist ou Login Kooks (car ils sont obsolètes )?

    Sur Mountain Lion, tous les /etc/paths et /etc/launchd.conf édition ne prennent aucun effet!

    Les forums de développement de Apple disent:

    "Modifiez l'info.plist de .app lui-même pour contenir un dictionnaire" LSEnvironment "avec les variables d'environnement que vous voulez.

    ~ / .MacOSX / environment.plist n'est plus pris en charge. "

    J'ai donc directement édité l' Info.plist l'application (clic droit sur "AppName.app" (dans ce cas SourceTree), puis " Show package contents ")

    Afficher le contenu du paquet

    Et a ajouté une nouvelle paire clé / dict appelée:

     <key>LSEnvironment</key> <dict> <key>PATH</key> <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string> </dict> 

    (Voir: LaunchServicesKeys Documentation à Apple )

    Entrez la description de l'image ici

    Maintenant, l'application (dans mon cas SourceTree) utilise le chemin donné et fonctionne avec git 1.9.3 🙂

    PS: Bien sûr, vous devez ajuster l'entrée du chemin vers vos besoins spécifiques.

    La solution utilise la fonctionnalité de launchctl , combinée à un agent de lancement pour imiter les crochets de connexion d'anciens. Pour d'autres solutions utilisant le magasin de launchd , voir cette comparaison . L'agent de lancement utilisé ici est situé dans / Library / LaunchAgents / :

     <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>user.conf.launchd</string> <key>Program</key> <string>/Users/Shared/conflaunchd.sh</string> <key>ProgramArguments</key> <array> <string>~/.conf.launchd</string> </array> <key>EnableGlobbing</key> <true/> <key>RunAtLoad</key> <true/> <key>LimitLoadToSessionType</key> <array> <string>Aqua</string> <string>StandardIO</string> </array> </dict> </plist> 

    Une chose importante est la clé RunAtLoad afin que l'agent de lancement soit exécuté le plus tôt possible. Le vrai travail se fait dans le script shell /Users/Shared/conflaunchd.sh , qui lit ~ / .conf.launchd et l'alimente en launchctl :

     #! /bin/bash #filename="$1" filename="$HOME/.conf.launchd" if [ ! -r "$filename" ]; then exit fi eval $(/usr/libexec/path_helper -s) while read line; do # skip lines that only contain whitespace or a comment if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi eval launchctl $line done <"$filename" exit 0 

    Notez l'appel de path_helper pour que PATH soit configuré correctement. Enfin, ~ / .conf.launchd ressemble à ça

     setenv PATH ~/Applications:"${PATH}" setenv TEXINPUTS .:~/Documents/texmf//: setenv BIBINPUTS .:~/Documents/texmf/bibtex//: setenv BSTINPUTS .:~/Documents/texmf/bibtex//: # Locale setenv LANG en_US.UTF-8 

    Ce sont des commandes launchctl , voir sa page de manuel pour plus d'informations. Fonctionne bien pour moi (je dois mentionner que je suis toujours un gars Snow Leopard), les applications GUI telles que texstudio et TeXShop peuvent voir mon propre arbre tex. Des choses qui peuvent être améliorées:

    1. Le script shell a un #filename="$1" . Ce n'est pas accidentel, car le nom du fichier doit être alimenté au script par l'agent de lancement comme argument, mais cela ne fonctionne pas.

    2. Comme mentionné ici (allemand et derrière un paroi de paiement!), Il est possible de mettre le script dans l'agent de lancement lui-même.

    3. Je ne suis pas sûr de la sécurité de cette solution, car il utilise eval avec les chaînes fournies par l'utilisateur.

    4. Je pense que je me souviens que la définition de MANPATH utilisant cette méthode n'a pas bien fonctionné, mais je n'en suis pas certaine.

    Il convient de mentionner que Apple a prévu une approche quelque peu similaire en mettant des éléments dans ~ / launchd.conf , mais il n'est actuellement pas pris en charge pour cette date et ce système d'exploitation (voir la page de launchd.conf de launchd.conf ). Je suppose que des choses comme les globbing ne fonctionneraient pas comme ils l'ont fait dans cette proposition. Et bien sûr, on peut mettre ces fichiers ailleurs, sauf l'agent de lancement qui doit résider dans / Library / LaunchAgents / ou ~ / Library / LaunchAgents / .

    Enfin, je devrais mentionner les sources que j'ai utilisées comme informations sur les agents de lancement: 1 , 2 , 3 , 4 .

    Mise à jour : cela ne fonctionne pas actuellement dans la version 10.8. Les solutions de rechange par application sont décrites ici et ici .

    La réponse fournie par @ percival-ulysses fonctionne pour moi sur 10.9 Mavericks avec le petit changement suivant: éditer /Users/Shared/conflaunchd.sh script juste avant de exit 0 et ajouter les lignes

     killall Dock killall SystemUIServer 

    Pour redémarrer le Dock et le menu. Après cela, les applications démarrées à partir du Dock ou de Spotlight hériteront du PATH correct. Si vous utilisez Finder pour démarrer les applications critiques PATH, killall Finder peut également être ajouté.

    Dans le .bash_profile j'utilise la ligne

     export PATH=`launchctl getenv PATH` 

    Pour définir le PATH pour le Terminal, de cette façon, le PATH est contrôlé à partir du même emplacement, le fichier ~ / .conf.launchd .

    La réponse fournie par @flori fonctionne pour moi sur Maverick à condition que je exécute les commandes suivantes dans Terminal après avoir changé le fichier plist

     /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user killall Finder 

    Une autre option consiste à utiliser /etc/launchd.conf . Par exemple, j'ai modifié le PATH par défaut en ajoutant cette ligne à /etc/launchd.conf :

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

    Vous pouvez appliquer des modifications à /etc/launchd.conf en redémarrant ou en exécutant launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf et les processus de terminaison et de relance.

    Les paramètres dans /etc/launchd.conf s'appliquent à la fois au processus racine lancé et aux processus lancés par utilisateur. Les variables d'environnement définies avec setenv dans /etc/launchd.conf sont affichées à la fois par sudo launchctl export et launchctl export .