Solution pour les applications de ligne de commande et d'interface graphique à partir d'une seule source (fonctionne avec Mac OS X v10.10 (Yosemite) et Mac OS X v10.11 (El Capitan))
Supposons que vous ayez des définitions de variables d'environnement dans votre ~/.bash_profile
comme dans l'extrait de code suivant:
export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
Nous avons besoin d'un agent de lancement qui s'exécutera à chaque connexion et à tout moment sur demande qui va charger ces variables dans la session utilisateur. Nous aurons également besoin d'un script shell pour analyser ces définitions et construire les commandes nécessaires à exécuter par l'agent.
Créez un fichier avec plist
suffixe (par exemple nommé osx-env-sync.plist
) dans le ~/Library/LaunchAgents/
répertoire avec le contenu suivant:
<?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>osx-env-sync</string>
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-l</string>
<string>-c</string>
<string>
$HOME/.osx-env-sync.sh
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
-l
le paramètre est critique ici; il est nécessaire pour exécuter le script de shell avec un shell de connexion afin qu'il ~/.bash_profile
soit originaire avant l'exécution de ce script.
Maintenant, le script shell. Créez-le ~/.osx-env-sync.sh
avec le contenu suivant:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv ${envvar} ${!envvar}
done
Assurez-vous que le script shell est exécutable:
chmod +x ~/.osx-env-sync.sh
Maintenant, chargez l'agent de lancement pour la session en cours:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
(Re) Lancez une application GUI et vérifiez qu'elle peut lire les variables d'environnement.
La configuration est persistante. Il survivra aux redémarrages et aux reconnexions.
Après la configuration initiale (que vous venez de faire), si vous souhaitez refléter à nouveau tout changement dans votre ~/.bash_profile
environnement, la réexécution de la launchctl load ...
commande n'effectuera pas ce que vous voulez; à la place, vous obtiendrez un avertissement comme celui-ci:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Pour recharger vos variables d'environnement sans passer par le processus de déconnexion / connexion, procédez comme suit:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Enfin, assurez-vous de relancer vos applications déjà en cours d'exécution (y compris Terminal.app) pour les informer des modifications.
J'ai également poussé le code et les explications ici vers un projet GitHub: osx-env-sync .
J'espère que ce sera la solution ultime, au moins pour les dernières versions d'OS X (Yosemite & El Capitan).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
pour lancer l'application GUI avec un nouvel environnement système défini.