Umgebungsvariablen in Mac OS X.

186

Update: Der unten stehende Link hat keine vollständige Antwort . Das Festlegen des Pfads oder der Variablen an zwei Stellen (eine für die GUI und eine für die Shell) ist lahm.

Nicht doppelt vorhanden von : Festlegen von Umgebungsvariablen in OS X?


Ausgehend von einem Windows-Hintergrund, in dem es sehr einfach ist, Umgebungsvariablen festzulegen und zu ändern (gehen Sie einfach zu Systemeigenschaften> Erweitert> Umgebungsvariablen), scheint dies unter Mac OS 10.5 nicht so einfach zu sein. Die meisten Referenzen sagen, ich sollte / etc / profile oder ~ / .profile aktualisieren. Entsprechen diese Systemvariablen und Benutzervariablen? Wo soll ich zum Beispiel meine JAVA_HOMEVariable setzen?


BEARBEITEN:

Ich möchte sowohl über das Terminal als auch über eine App wie Eclipse auf die Variable zugreifen können. Außerdem hoffe ich, dass ich nicht neu starten / abmelden muss, damit dies wirksam wird.

Abdullah Jibaly
quelle
Und es gibt einige Ratschläge in den Antworten auf die Link-Frage, die hier nicht wiederholt wird ...
dmckee --- Ex-Moderator Kätzchen

Antworten:

142

Es ist keine Vervielfältigung erforderlich. Sie können Umgebungsvariablen festlegen, die von launchd (und untergeordneten Prozessen, dh alles, was Sie von Spotlight aus starten) verwendet werdenlaunchctl setenv .

Wenn Sie beispielsweise Ihren aktuellen Pfad in launchd spiegeln möchten, nachdem Sie ihn in .bashrcoder wo auch immer eingerichtet haben:

PATH=whatever:you:want
launchctl setenv PATH $PATH

Umgebungsvariablen werden in laufenden Anwendungen nicht automatisch aktualisiert. Sie müssen Anwendungen neu starten, um die aktualisierten Umgebungsvariablen zu erhalten (obwohl Sie nur Variablen in Ihrer Shell festlegen können, z PATH=whatever:you:want. B. das Terminal muss nicht neu gestartet werden).

Matt Curtis
quelle
1
Sieht nach der besten Antwort aus, keine App von Drittanbietern erforderlich!
Abdullah Jibaly
2
Dies scheint nicht global zu sein: Auf diese Weise festgelegte Umgebungsvariablen sind für den Benutzer lokal. Wir haben immer noch keinen globalen Mechanismus zum Festlegen einer Umgebungsvariablen.
Andrew
@ Andrew Was meinst du, lokal für den Benutzer? Ich würde erwarten, dass alle Prozesse, die nach dem Start gestartet wurden, betroffen sind.
Matt Curtis
@MattCurtis: Umgebungsvariablen, die über festgelegt wurden, launchctl setenvscheinen nur für den Benutzer sichtbar zu sein, der die Änderung vornimmt . Wenn ich eine Variable als normaler Benutzer festlege, ist sie für root (über sudo) nicht sichtbar und umgekehrt.
Andrew
2
@ Andrew OK, root hat einen eigenen Start - ps aux | grep launchdwird dies zeigen. Überprüfen Sie auch man sudo, welche Dokumente sudo(standardmäßig) die Umgebung absichtlich zurücksetzen - wenn Sie sudo -Edie Umgebung (einschließlich der von Ihnen festgelegten Variablen launchctl setenv) erhalten. Haben Sie übrigens eine aktuelle Bewerbung dafür? Wenn ja, funktioniert diese Methode für Sie?
Matt Curtis
298

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.
  • launchdInstanz 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 setenvBefehl in anwenden launchctl. Theoretisch sollten Sie in der Lage sein, setenvBefehle einzugeben ~/.launchd.confund launchddiese 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 launchdUmgebung 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 &lt; ~/.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.

LaC
quelle
3
Eigentlich in Bezug ~/.MacOSX/environment.plistauf meinem Lion es wird gelesen und verwendet. Habe es gerade getestet. Ich bevorzuge es tatsächlich gegenüber .launchd.conf, da ich das RCenvironment-Einstellungsfenster verwende , um es zu pflegen.
Gilimanjaro
5
Ich kann nicht ~/.launchd.confmit 10.6.8 arbeiten - es scheint keine Auswirkungen zu haben. Außerdem sagt die Manpage, dass diese Datei derzeit nicht unterstützt wird.
snowcrash09
4
~ / .launchd.conf scheint auch unter 10.7.3 nicht zu funktionieren, und wenn ich in die Manpage schaue, steht dort $ HOME / .launchd.conf Ihre Startkonfigurationsdatei (derzeit nicht unterstützt)
unkreativ
4
In 10.8 (Mountain Lion) wird ~ / .MacOSX / environment.plist nicht mehr unterstützt. Laut Apple Dev muss "die Info.plist der .app selbst so geändert werden, dass sie ein" LSEnvironment "-Wörterbuch mit den gewünschten Umgebungsvariablen enthält." Weitere Informationen finden Sie unter apple.stackexchange.com/questions/57385/…
pnkfelix
3
@LaC Großartiger, umfassender Beitrag; ~/.launchd.confKönnten Sie es bitte aktualisieren, um festzustellen, dass es immer noch nicht unterstützt wird und ab OS X 10.8.3 nicht funktioniert? Sieheman launchd.conf
mklement0
12

Ich denke, das OP sucht nach einer einfachen, Windows-ähnlichen Lösung.

hier gehts:

https://www.macupdate.com/app/mac/14617/rcenvironment

Tom Teman
quelle
1
Wow, das sieht cool aus. habe es noch nicht ausprobiert, sieht aber genau so aus, wie ich es aus der Beschreibung brauchte.
Abdullah Jibaly
6
Übrigens scheint der ursprüngliche Link gebrochen zu sein, seit ich ihn gepostet habe (was ist los, Apple? 301 sind teuer?). Sie können stattdessen diesen Link verwenden: macupdate.com/app/mac/14617/rcenvironment
Tom Teman
Das ist wirklich alt. Schauen Sie sich die andere Antwort an, in der osx-env-sync für eine moderne Lösung erwähnt wird, die auch unter OS X 10.10 (Yosemite) und höher funktioniert.
Warren P
Bitte fassen Sie die Informationen über den Link in Ihrer Antwort zusammen. Wie wir bereits gesehen haben, brechen Links aus verschiedenen Gründen.
user3.1415927
7

Sie können unter Linux nachlesen, was Mac OS X ziemlich nahe kommt. Oder Sie können sich über BSD Unix informieren, das etwas näher liegt. Die Unterschiede zwischen Linux und BSD sind größtenteils nicht groß.

/etc/profile sind Systemumgebungsvariablen.

~/.profile sind benutzerspezifische Umgebungsvariablen.

"Wo soll ich meine JAVA_HOME-Variable setzen?"

  • Haben Sie mehrere Benutzer? Interessieren sie sich? Würden Sie einen anderen Benutzer durch Ändern von a durcheinander bringen /etc/profile?

Im Allgemeinen ziehe ich es vor, mich nicht mit systemweiten Einstellungen herumzuschlagen, obwohl ich der einzige Benutzer bin. Ich bevorzuge es, meine lokalen Einstellungen zu bearbeiten.

S.Lott
quelle
5

Für GUI-Apps müssen Sie erstellen und bearbeiten ~/.MacOSX/environment.plist. Weitere Details hier . Sie müssen sich abmelden, damit diese wirksam werden. Ich bin nicht sicher, ob sie sich auch auf Anwendungen auswirken, die über das Terminal gestartet wurden, aber ich gehe davon aus, dass dies der Fall ist.

Für Apps, die über Terminal gestartet werden, können Sie auch die Datei ~ / .profile bearbeiten.

JW.
quelle
2
Ja, Terminal erbt die Variablen, ebenso wie alles, was vom Terminal gestartet wird. Sie können den Einstellungsbereich RCenvironment verwenden , um die Variablen zu verwalten.
Gilimanjaro
1
Diese Lösung funktioniert mit einigen Versionen von Mac OS X 10.7 nicht mehr. Bei keiner Version von Mac OS X 10.8 oder höher ist dies der Fall. Siehe stattdessen: stackoverflow.com/a/4567308/543738
LS
3

Öffnen Sie einfach die ~/.profileDatei über nanoin Terminal und geben Sie dort Folgendes ein:

export PATH=whatever/you/want:$PATH

Speichern Sie diese Datei (cmd + X und Y). Danach melden Sie sich bitte erneut ab oder öffnen Sie einfach eine neue Registerkarte in Terminal und versuchen Sie, Ihre neue Variable zu verwenden.

BITTE vergessen Sie nicht, ": $ PATH" nach was auch immer / Sie / wollen hinzuzufügen, sonst löschen Sie alle Pfade in der PATH-Variablen, die vorher da waren.

Migele
quelle
4
Dies gilt nur für die Bash-Befehlsumgebung. Hier festgelegte Variablen werden von GUI-Anwendungen nicht angezeigt.
Warren P.
3

Synchronisieren Sie OS X-Umgebungsvariablen für Befehlszeilen- und GUI-Anwendungen aus einer Hand mit osx-env-sync .

Ich stellte auch eine Antwort auf eine ähnliche Frage hier .

Ersin Er
quelle
Das ist fantastisch. Vorschlag: Fügen Sie das Element launchctl unload / launctl load "Jetzt aktualisieren" in ein Skript ein. Ich nannte es osx-env-sync-now.sh. Ich ändere mein .bash_profile und führe das kleine Skript "Jetzt aktualisieren" aus und fahre fort. Ich denke, dass es hier Auswirkungen auf die Sicherheit gibt, daher denke ich, dass einige Einschränkungen vorgenommen werden sollten. Es muss Gründe geben, warum sie diese Funktion in OS X deaktiviert haben.
Warren P
@WarrenP Fertig! Überprüfen Sie das Repo.
Ersin Er
Ausgezeichnet. Dies löste eine Menge Schmerzen für mich. Ein Fall, in dem dies wirklich nützlich ist, ist für alle, die mit SCALA entwickeln. Das Festlegen von SCALA_HOME sowohl für die Befehlszeilenskala als auch für die GUI-Skala (z. B. in Netbeans) ist ansonsten ein echtes Problem.
Warren P
0

Wenn Sie Umgebungsvariablen unter macOS dauerhaft ändern möchten, legen Sie sie fest /etc/paths. Beachten Sie , dass diese Datei standardmäßig schreibgeschützt ist, sodass Sie für Schreibberechtigungen chmod benötigen .

IgorGanapolsky
quelle
Das funktioniert bei mir nicht. Ich habe /usr/bin/localin dieser Datei, auch ohne die Datei zu ändern, es war standardmäßig so, und dennoch sehen meine GUI-Apps nur /usr/bin:/bin:/usr/sbin:/sbin. Ich habe viele Male neu gestartet.
mgol
@m_gol Was bekommst du, wenn du rennst cat /etc/paths/?
Igor Ganapolsky
1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, in separaten Zeilen. Und doch sieht SourceTree alle außer dem ersten.
mgol
Vielleicht haben Sie bearbeiten möchten „Wenn Sie die Standardeinstellung ändern möchten Pfad in macOS“. Dies hat nichts mit dem allgemeineren Problem der Umgebungsvariablen zu tun.
Rfay
0

Für Benutzer von Mac OS X Catalina 2020:

Vergessen Sie andere nutzlose Antworten, hier sind nur zwei Schritte erforderlich:

  1. Erstellen Sie eine Datei mit der Namenskonvention: priority-appname. Kopieren Sie dann den Pfad, dem Sie hinzufügen möchten, und fügen Sie ihn einPATH .

    ZB 80-vscodemit Inhalten /Applications/Visual Studio Code.app/Contents/Resources/app/bin/in meinem Fall.

  2. Verschieben Sie diese Datei nach /etc/paths.d/. Vergessen Sie nicht, eine neue Registerkarte (neue Sitzung) im Terminal zu öffnen und einzugeben echo $PATH, um zu überprüfen, ob Ihr Pfad hinzugefügt wurde!

Hinweis: Diese Methode hängt nur Ihren Pfad an PATH.

Regen
quelle