Lösung sowohl für Kommandozeilen- als auch für GUI-Anwendungen aus einer Hand (funktioniert mit Mac OS X v10.10 (Yosemite) und Mac OS X v10.11 (El Capitan))
Nehmen wir an, Sie haben Umgebungsvariablendefinitionen in Ihrem ~/.bash_profile
wie im folgenden Ausschnitt:
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"
Wir brauchen eine Launch Agent die bei jeder Anmeldung und jederzeit bei Bedarf ausgeführt wird, um diese Variablen in die Benutzersitzung zu laden. Außerdem benötigen wir ein Shell-Skript, das diese Definitionen analysiert und die notwendigen Befehle erstellt, die vom Agenten ausgeführt werden.
Erstellen Sie eine Datei mit plist
Suffix (z.B. named osx-env-sync.plist
) in ~/Library/LaunchAgents/
Verzeichnis mit folgendem Inhalt:
<?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
ist hier entscheidend; er ist notwendig für die Ausführung des Shell-Skripts mit einer Login-Hülle so dass ~/.bash_profile
vor der Ausführung dieses Skripts beschafft wird.
Und nun das Shell-Skript. Erstellen Sie es unter ~/.osx-env-sync.sh
mit folgendem Inhalt:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv "${envvar}" "${!envvar}"
done
Stellen Sie sicher, dass das Shell-Skript ausführbar ist:
chmod +x ~/.osx-env-sync.sh
Laden Sie nun den Startagenten für die aktuelle Sitzung:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Starten Sie eine GUI-Anwendung (erneut) und überprüfen Sie, ob sie die Umgebungsvariablen lesen kann.
Die Einrichtung ist hartnäckig. Sie übersteht Neustarts und Neuanmeldungen.
Wenn Sie nach der Ersteinrichtung (die Sie gerade vorgenommen haben) Änderungen an Ihren ~/.bash_profile
auf Ihre gesamte Umgebung zu übertragen, indem Sie die launchctl load ...
führt nicht das aus, was Sie wollen; stattdessen erhalten Sie eine Warnung wie die folgende:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Um Ihre Umgebungsvariablen neu zu laden, ohne den Logout/Login-Prozess zu durchlaufen, gehen Sie wie folgt vor:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Stellen Sie abschließend sicher, dass Sie Ihre bereits laufenden Anwendungen (einschließlich Terminal.app) neu starten, damit sie von den Änderungen Kenntnis erhalten.
Ich habe den Code und die Erklärungen hier auch in ein GitHub-Projekt verschoben: osx-env-sync .
Ich hoffe, dass dies die ultimative Lösung sein wird, zumindest für die neuesten Versionen von OS X (Yosemite & El Capitan).