Lösung für Befehlszeilen- und GUI-Anwendungen aus einer Hand (funktioniert mit Mac OS X 10.10 (Yosemite) und Mac OS X 10.11 (El Capitan))
Nehmen wir an, Sie haben Umgebungsvariablendefinitionen ~/.bash_profile
wie folgt im folgenden Snippet:
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 benötigen einen Launch Agent, der bei jeder Anmeldung und bei Bedarf jederzeit ausgeführt wird und diese Variablen in die Benutzersitzung lädt. Wir benötigen außerdem ein Shell-Skript, um diese Definitionen zu analysieren und die erforderlichen Befehle zu erstellen, die vom Agenten ausgeführt werden müssen.
Erstellen Sie eine Datei mit dem plist
Suffix (z. B. benannt osx-env-sync.plist
) in einem ~/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
Parameter ist hier kritisch; Es ist erforderlich, das Shell-Skript mit einer Login-Shell auszuführen , damit ~/.bash_profile
es zuerst bezogen wird, bevor dieses Skript ausgeführt wird.
Nun das Shell-Skript. Erstellen Sie es ~/.osx-env-sync.sh
mit den folgenden Inhalten:
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
(Neu) Starten Sie eine GUI-Anwendung und überprüfen Sie, ob sie die Umgebungsvariablen lesen kann.
Das Setup ist dauerhaft. Es wird Neustarts und Neuanmeldungen überleben.
Wenn Sie nach der ~/.bash_profile
Ersteinrichtung (die Sie gerade durchgeführt haben) Änderungen in Ihrer gesamten Umgebung erneut widerspiegeln möchten, führt das erneute Ausführen des launchctl load ...
Befehls nicht das aus, was Sie möchten. Stattdessen erhalten Sie eine Warnung wie die folgende:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Gehen Sie wie folgt vor, um Ihre Umgebungsvariablen neu zu laden, ohne den Abmelde- / Anmeldevorgang durchlaufen zu müssen:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Stellen Sie schließlich sicher, dass Sie Ihre bereits ausgeführten Anwendungen (einschließlich Terminal.app) neu starten, um sie auf die Änderungen aufmerksam zu machen.
Ich habe auch den Code und die Erklärungen hier in ein GitHub-Projekt übertragen: 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).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
um die GUI-Anwendung mit einer neuen festgelegten Systemumgebung zu starten.