Es gibt mehrere Stellen, an denen Sie Umgebungsvariablen festlegen können.
~/.profile
: Verwenden Sie diese Option für Variablen, die Sie in allen vom Terminal gestarteten Programmen festlegen möchten (beachten Sie, dass im Gegensatz zu Linux alle in Terminal.app geöffneten Shells Login-Shells sind).
~/.bashrc
: Dies wird für Shells aufgerufen, die keine Login-Shells sind. Verwenden Sie dies für Aliase und andere Dinge, die in Unterschalen neu definiert werden müssen, nicht für vererbte Umgebungsvariablen.
/etc/profile
: Dies wird vor ~ / .profile geladen, ist aber ansonsten gleichwertig. Verwenden Sie diese Option, wenn die Variable auf Terminalprogramme angewendet werden soll, die von allen Benutzern auf dem Computer gestartet wurden (vorausgesetzt, sie verwenden bash).
~/.MacOSX/environment.plist
: Dies wird vom Login-Fenster beim Login gelesen. Dies gilt für alle Anwendungen, einschließlich der GUI-Anwendungen, mit Ausnahme derjenigen, die von Spotlight in 10.5 (nicht 10.6) gestartet wurden. Sie müssen sich abmelden und erneut anmelden, damit die Änderungen wirksam werden. Diese Datei wird ab OS X 10.8 nicht mehr unterstützt.
launchd
Instanz Ihres Benutzers : Dies gilt für alle Programme, die vom Benutzer, der GUI und der CLI gestartet werden. Sie können Änderungen jederzeit mit dem setenv
Befehl in anwenden launchctl
. Theoretisch sollten Sie in der Lage sein, setenv
Befehle einzugeben ~/.launchd.conf
und launchd
diese automatisch zu lesen, wenn sich der Benutzer anmeldet. In der Praxis wurde die Unterstützung für diese Datei jedoch nie implementiert. Stattdessen können Sie einen anderen Mechanismus verwenden, um ein Skript bei der Anmeldung auszuführen, und diesen Skriptaufruf ausführen launchctl
, um die launchd
Umgebung einzurichten .
/etc/launchd.conf
: Dies wird von launchd gelesen, wenn das System gestartet wird und wenn sich ein Benutzer anmeldet. Sie wirken sich auf jeden einzelnen Prozess auf dem System aus, da launchd der Root-Prozess ist. Um Änderungen am laufenden Root-Start anzuwenden, können Sie die Befehle in weiterleiten sudo launchctl
.
Die grundlegenden Dinge zu verstehen sind:
- Umgebungsvariablen werden von den untergeordneten Elementen eines Prozesses zum Zeitpunkt des Verzweigens geerbt.
- Der Root-Prozess ist eine Startinstanz, und es gibt auch eine separate Startinstanz pro Benutzersitzung.
- Mit launchd können Sie die aktuellen Umgebungsvariablen mithilfe von ändern
launchctl
. Die aktualisierten Variablen werden dann von allen neuen Prozessen geerbt, die von da an gegabelt werden.
Beispiel für das Festlegen einer Umgebungsvariablen mit launchd:
echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl
Starten Sie jetzt Ihre GUI-App, die die Variable verwendet, und voila!
Um die Tatsache zu umgehen, dass ~/.launchd.conf
umgehen dies nicht funktioniert, können Sie das folgende Skript einfügen ~/Library/LaunchAgents/local.launchd.conf.plist
:
<?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>local.launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl < ~/.launchd.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Dann kannst du setzen setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE
hineinstecken ~/.launchd.conf
, und es wird bei jedem Login ausgeführt.
Beachten Sie, dass Sie beim Weiterleiten einer Befehlsliste an launchctl auf diese Weise keine Umgebungsvariablen mit Werten festlegen können, die Leerzeichen enthalten. Wenn Sie dies benötigen, können Sie launchctl wie folgt aufrufen : launchctl setenv MYVARIABLE "QUOTE THE STRING"
.
Beachten Sie außerdem, dass andere Programme, die bei der Anmeldung ausgeführt werden, möglicherweise vor dem Startagenten ausgeführt werden und daher die von ihm festgelegten Umgebungsvariablen möglicherweise nicht sehen.