946 Stimmen

Setzen von Umgebungsvariablen unter OS X

Wie lassen sich Umgebungsvariablen wie PATH in OS X richtig ändern?

Ich habe ein wenig bei Google gesucht und drei verschiedene Dateien zum Bearbeiten gefunden:

  • /etc/paths
  • ~/.Profil
  • ~/.tcshrc

Einige dieser Dateien habe ich nicht einmal, und ich bin ziemlich sicher, dass .tcshrc ist falsch, da OS X jetzt Bash verwendet. Wo sind diese Variablen, insbesondere PATH, definiert?

Ich laufe OS X v10.5 (Leopard).

37voto

pajato0 Punkte 3512

Es gibt im Wesentlichen zwei Probleme zu lösen, wenn es um Umgebungsvariablen in OS X zu lösen. Das erste ist beim Aufruf von Programmen aus Spotlight (das Lupensymbol auf der rechten Seite des Mac Menü/Statusleiste) und das zweite beim Aufrufen von Programmen aus dem Dock. Das Aufrufen von Programmen aus einem Terminal-Programm ist trivial weil es die Umgebung aus den Standard-Shell-Speicherorten liest ( ~/.profile , ~/.bash_profile , ~/.bashrc etc.)

Wenn Sie Programme aus dem Dock aufrufen, verwenden Sie ~/.MacOSX/environment.plist wo die <dict> Element enthält eine Folge von <key>KEY</key><string>theValue</string> Elemente.

Wenn Sie Programme von Spotlight aus aufrufen, stellen Sie sicher, dass launchd mit allen erforderlichen Schlüssel/Wert-Einstellungen eingerichtet ist.

Um beide Probleme gleichzeitig zu lösen, verwende ich ein Login-Element (eingestellt über das Systemeinstellungen) für mein Benutzerkonto. Das Login-Element ist ein Bash-Skript, das eine Emacs-Lisp-Funktion aufruft, aber man kann natürlich auch sein Lieblings-Skriptprogramm verwenden, um das Gleiche zu erreichen. Dieser Ansatz hat den zusätzlichen Vorteil, dass es jederzeit funktioniert und keinen Neustart erfordert. Neustart, d.h. man kann ~/.profile Sie können das Anmeldeelement in einer Shell ausführen und die Änderungen für neu aufgerufene Programme sichtbar machen, entweder im Dock oder in Spotlight.

Einzelheiten:

Element anmelden: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Emacs-Lisp-Funktion: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

HINWEIS: Diese Lösung ist eine Mischung aus den Lösungen, die vor mir kamen, insbesondere aus der von Matt Curtis, aber ich habe bewusst versucht, meine ~/.bash_profile Inhalte plattformunabhängig und stellen die Einstellung der launchd Umgebung (nur für Mac) in ein separates Skript.

26voto

Big Rich Punkte 5649

Eine andere, kostenlose, quelloffene Lösung für Mac OS X v10.8 (Mountain Lion) Preference pane/environment.plist ist EnvPane .

EnvPane's Quellcode verfügbar unter GitHub . EnvPane scheint vergleichbare Funktionen zu haben wie RCEnvironment Es scheint jedoch, dass es seine gespeicherten Variablen sofort aktualisieren kann, d. h. ohne die Notwendigkeit eines Neustarts oder einer Anmeldung, was zu begrüßen ist.

Wie vom Entwickler angegeben:

EnvPane ist ein Einstellungsfenster für Mac OS X 10.8 (Mountain Lion), das Sie Umgebungsvariablen für alle Programme sowohl in grafischen als auch in und Terminal-Sitzungen. Es stellt nicht nur die Unterstützung für ~/.MacOSX/environment.plist in Mountain Lion wieder, sondern veröffentlicht auch Ihre Änderungen an der Umgebung sofort veröffentlicht, ohne dass Sie sich abmelden müssen. und wieder anzumelden. <SNIP> EnvPane enthält (und installiert automatisch) einen launchd-Agent, der 1) früh nach der Anmeldung und 2) immer dann ausgeführt wird, wenn die ~/.MacOSX/environment.plist ändert. Der Agent liest ~/.MacOSX/environment.plist und exportiert die Umgebungsvariablen aus dieser Datei in die launchd-Instanz des aktuellen Benutzers über die gleiche API, die die von launchctl setenv und launchctl unsetenv verwendet wird.

Haftungsausschluss: Ich bin in keiner Weise mit dem Entwickler oder seinem Projekt verbunden.

P.S. Ich mag den Namen (klingt wie 'Ends Pain').

21voto

Flori Punkte 2453

Unter Mountain Lion werden alle /etc/paths y /etc/launchd.conf Die Bearbeitung hat keine Auswirkungen!

Apples Entwicklerforen sagen:

"Ändern Sie die Info.plist der .app selbst so, dass sie eine "LSEnvironment" enthält. Wörterbuch mit den gewünschten Umgebungsvariablen enthält.

~/.MacOSX/environment.plist wird nicht mehr unterstützt."

Also habe ich direkt die Anwendung Info.plist (Rechtsklick auf "AppName.app" (in diesem Fall SourceTree) und dann " Show package contents ").

Show Package Contents

Und ich habe ein neues Schlüssel/Diktat-Paar namens:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(siehe: LaunchServicesKeys Dokumentation bei Apple )

Enter image description here

Jetzt verwendet die Anwendung (in meinem Fall Sourcetree) den angegebenen Pfad und funktioniert mit Git 1.9.3 :-)

PS: Natürlich müssen Sie den Pfadeintrag an Ihre speziellen Bedürfnisse anpassen.

17voto

Max Leske Punkte 4899

Update (2017-08-04)

Seit (mindestens) macOS 10.12.6 (Sierra) scheint diese Methode für Apache httpd nicht mehr zu funktionieren (sowohl für die system et le user Option von launchctl config ). Andere Programme scheinen nicht betroffen zu sein. Es ist denkbar, dass es sich um einen Fehler in httpd handelt.

Ursprüngliche Antwort

Dies betrifft OS X 10.10+ (10.11+ speziell wegen des Rootless-Modus, bei dem /usr/bin ist nicht mehr beschreibbar).

Ich habe an mehreren Stellen gelesen, dass die Verwendung von launchctl setenv PATH <new path> zum Einstellen der PATH aufgrund eines Fehlers in OS X nicht funktioniert (was aus persönlicher Erfahrung zu stimmen scheint). Ich habe herausgefunden, dass es einen anderen Weg gibt, die PATH kann eingestellt werden für Anwendungen, die nicht von der Shell aus gestartet werden :

sudo launchctl config user path <new path>

Diese Option ist in der Manpage von launchctl dokumentiert:

config system | user parameter wert

Setzt dauerhafte Konfigurationsinformationen für launchd(8)-Domänen. Es können nur die Systemdomäne und die Benutzerdomänen konfiguriert werden. Der Ort des persistenten Speichers ist ein Implementierungsdetail, und Änderungen an diesem Speicher sollten nur über diesen Unterbefehl vorgenommen werden. Ein Neustart ist erforderlich, damit die mit diesem Unterbefehl vorgenommenen Änderungen wirksam werden.

[...]

Pfad

Setzt die Umgebungsvariable PATH für alle Dienste innerhalb der Zieldomäne auf den String-Wert. Der String-Wert sollte dem Format entsprechen, das für die PATH Umgebungsvariable in environ(7) beschrieben ist. Beachten Sie, dass, wenn ein Dienst seinen eigenen PATH angibt, die dienstspezifische Umgebungsvariable Vorrang hat.

HINWEIS: Diese Funktion kann nicht verwendet werden, um allgemeine Umgebungsvariablen für alle Dienste innerhalb der Domäne zu setzen. Sie ist absichtlich auf die Umgebungsvariable PATH beschränkt. beschränkt und aus Sicherheitsgründen auf nichts anderes.

Ich habe bestätigt, dass dies mit einer aus dem Finder gestarteten GUI-Anwendung funktioniert (die getenv um PATH zu erhalten). Beachten Sie, dass Sie dies nur einmal tun müssen und die Änderung auch nach einem Neustart bestehen bleibt.

15voto

Jason T. Miller Punkte 662

Während die Antworten hier nicht "falsch" sind, füge ich noch eine weitere hinzu: Nehmen Sie unter OS X niemals Änderungen an Umgebungsvariablen vor, die sich auf "alle Prozesse" auswirken, oder sogar, außerhalb der Shell, für alle Prozesse, die von einem bestimmten Benutzer interaktiv ausgeführt werden.

Meiner Erfahrung nach führen globale Änderungen an Umgebungsvariablen wie PATH für alle Prozesse unter OS X noch häufiger zu Problemen als unter Windows. Der Grund dafür ist, dass viele OS X-Anwendungen und andere Software (einschließlich, vielleicht vor allem, Komponenten des Betriebssystems selbst) unter der Haube auf UNIX-Befehlszeilen-Tools angewiesen sind und das Verhalten der mit dem System gelieferten Versionen dieser Tools annehmen und dabei nicht unbedingt absolute Pfade verwenden (ähnliche Kommentare gelten für dynamisch geladene Bibliotheken und DYLD_*-Umgebungsvariablen). Bedenken Sie zum Beispiel, dass die am höchsten bewerteten Antworten auf verschiedene Stack Overflow-Fragen über das Ersetzen von OS X-gelieferten Versionen von Interpretern wie Python und Ruby im Allgemeinen sagen: "Tu das nicht".

OS X unterscheidet sich in dieser Hinsicht nicht von anderen UNIX-ähnlichen Betriebssystemen (z. B. Linux, FreeBSD und Solaris); der wahrscheinlichste Grund, warum Apple keine einfache Möglichkeit bietet, dies zu tun, ist, dass es macht Dinge kaputt . Dass Windows nicht so anfällig für diese Probleme ist, hat zwei Gründe: (1) Windows-Software verlässt sich in der Regel nicht in dem Maße auf Befehlszeilentools wie UNIX-Software, und (2) Microsoft hat so viele Erfahrungen mit der "DLL-Hölle" und mit Sicherheitsproblemen gemacht, die durch Änderungen verursacht wurden, die sich auf alle Prozesse auswirken, dass das Unternehmen das Verhalten des dynamischen Ladens in neueren Windows-Versionen geändert hat, um die Auswirkungen "globaler" Konfigurationsoptionen wie PATH zu begrenzen.

Ob "lahm" oder nicht, Sie werden ein viel stabileres System haben, wenn Sie solche Änderungen auf kleinere Bereiche beschränken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X