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

18

Comment configurer les variables d'environnement dans Mac OS X de telle sorte qu'elles soient disponibles pour les applications GUI sans utiliser ~ / .MacOSX / environment.plist ou Login Hooks (car elles sont obsolètes )?

Percival Ulysse
la source
@ ersin-er La réponse de StackOverflow "Solution pour la ligne de commande et les applications GUI à partir d'une seule source (fonctionne avec Yosemite & El Capitan)" peut intéresser les personnes qui trouvent cette question.
l --marc l

Réponses:

16

Sur Mountain Lion tous les /etc/pathset l' /etc/launchd.confédition ne prend aucun effet!

Les forums des développeurs d'Apple disent:

"Modifiez le Info.plist du .app lui-même pour contenir un dictionnaire" LSEnvironment "avec les variables d'environnement souhaitées.

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

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

Afficher le contenu du paquet

et 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: documentation LaunchServicesKeys sur Apple )

entrez la description de l'image ici

maintenant l'App (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 Chemin d'accès à vos besoins spécifiques.

Flori
la source
1
Je vous remercie! C'était parfait pour moi. Le 10.11 (El Capitan), j'ai également dû exécuter les commandes fournies par Matthew pour voir mes modifications Info.plistprendre effet.
dsedivec
8

La solution utilise la fonctionnalité de launchctl, combinée avec un agent de lancement pour imiter les points d'ancrage de connexion des anciens. Pour d'autres solutions utilisant le magasin de launchd, consultez cette comparaison . L'agent de lancement utilisé ici se trouve 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 pour 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 le nourrit 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

Remarquez l'appel de path_helperpour configurer correctement PATH . 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 launchctlcommandes, voir sa page de manuel pour plus d'informations. Fonctionne très bien pour moi (je dois mentionner que je suis toujours un gars de Snow Leopard), les applications GUI telles que texstudio et TeXShop peuvent voir mon propre arbre tex. Choses qui peuvent être améliorées:

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

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

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

  4. Je pense me souvenir que la définition de MANPATH utilisant cette méthode n'a pas bien fonctionné, mais je ne suis pas sûr.

Il convient de mentionner qu'Apple envisageait 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 le système d'exploitation (voir la page de manuel de launchd.conf). Je suppose que des choses comme le globbing ne fonctionneraient pas comme elles le font dans cette proposition. Et bien sûr, on peut mettre ces fichiers n'importe où ailleurs, sauf l'agent de lancement qui doit résider dans / Library / LaunchAgents / ou ~ / Library / LaunchAgents / .

Enfin, je dois 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 pour le moment dans la version 10.8. Les solutions de contournement par application sont décrites ici et ici .

Percival Ulysse
la source
Au fait, si l'on veut définir la variable PATH dans un environnement Terminal et utilise cet agent de lancement, je suggère d'écrire export PATH=.:"$(launchctl getenv PATH)"dans ~ / .bash_profile (de même pour les autres shells). Ceci est possible car path_helperest appelé dans le script shell. Pour plus de détails sur la variable PATH sous OS X, vérifiez cette réponse .
Percival Ulysses
3

La réponse fournie par @flori fonctionne pour moi sur Maverick à condition que j'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
Matthieu
la source
J'ai eu le même comportement avec El Capitan, et j'ai ajouté votre point à la réponse de @ flori
Seki
2

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

killall Dock
killall SystemUIServer

pour redémarrer le Dock et la barre de menus. Après cela, les applications démarrées à partir du Dock ou de Spotlight hériteront du bon chemin. Si vous utilisez le Finder pour démarrer les applications critiques PATH, killall Findervous pouvez également les ajouter.

Dans .bash_profilela ligne j'utilise

export PATH=`launchctl getenv PATH`

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

Ury Marshak
la source
0

Une autre option consiste à utiliser /etc/launchd.conf. Par exemple, j'ai changé la valeur PATHpar 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.confsoit en redémarrant, soit en exécutant launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confet en arrêtant et en relançant les processus.

Les paramètres de /etc/launchd.confs'appliquent à la fois au processus root launchd et aux processus launchd par utilisateur. Les variables d'environnement définies avec setenvin /etc/launchd.confsont représentées par sudo launchctl exportet launchctl export.

Lri
la source