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
")
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 )
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:
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.
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.
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.
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
.