Frage Umgebungsvariablen in OS X einstellen?


Was ist der richtige Weg, um Umgebungsvariablen wie PATH in OSX zu ändern? Ich habe ein wenig nach Google gesucht und 3 verschiedene Dateien zum Bearbeiten gefunden:

  • / etc / Pfade
  • ~ / .profil
  • ~ / .tcshrc

Ich habe nicht einmal einige dieser Dateien, und ich bin mir ziemlich sicher .tcshrc ist falsch, da OSX bash jetzt verwendet. Hat jemand eine Idee, wo diese Variablen, insbesondere PATH, definiert sind?

Bearbeiten: Ich verwende OS X 10.5


773
2017-09-25 20:06


Ursprung


Antworten:


Bruno ist auf dem richtigen Weg. Ich habe umfangreiche Recherchen durchgeführt und wenn Sie Variablen festlegen möchten, die in allen GUI-Apps zur Verfügung stehen, ist Ihre einzige Option /etc/launchd.conf

Bitte beachte, dass environment.plist funktioniert nicht für Anwendungen, die über Spotlight gestartet werden. Dies dokumentiert Steve Sexton hier.

1) Öffnen Sie eine Terminal-Eingabeaufforderung

2) Geben Sie ein sudo vi /etc/launchd.conf (Hinweis: Diese Datei existiert möglicherweise noch nicht)

3) Fügen Sie Inhalte wie die folgenden in die Datei ein

# Set environment variables here so they are available globally to all apps
# (and Terminal), including those launched via Spotlight.
#
# After editing this file run the following command from the terminal to update 
# environment variables globally without needing to reboot.
# NOTE: You will still need to restart the relevant application (including 
# Terminal) to pick up the changes!
# grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
#
# See http://www.digitaledgesw.com/node/31
# and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
#
# Note that you must hardcode the paths below, don't use enviroment variables.
# You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
#
setenv JAVA_VERSION 1.6
setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
setenv GROOVY_HOME /Applications/Dev/groovy
setenv GRAILS_HOME /Applications/Dev/grails
setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
setenv JRUBY_HOME /Applications/Dev/jruby

setenv ANT_HOME /Applications/Dev/apache-ant
setenv ANT_OPTS -Xmx512M

setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
setenv M2_HOME /Applications/Dev/apache-maven

setenv JMETER_HOME /Applications/Dev/jakarta-jmeter

4) Speichern Sie Ihre Änderungen in VI und starten Sie Ihren Mac neu. Oder verwenden Sie den Befehl grep / xargs, der im obigen Code-Kommentar angezeigt wird.

5) Beweisen Sie, dass Ihre Variablen funktionieren, indem Sie ein Terminalfenster öffnen und tippen export und Sie sollten Ihre neuen Variablen sehen. Diese sind auch in IntelliJ und anderen GUI-Apps verfügbar, die Sie über Spotlight starten.


603
2018-02-25 23:42



So legen Sie die Umgebung für neue Prozesse fest, die von Spotlight gestartet werden (ohne dass ein Neustart erforderlich ist)

Sie können die Umgebung festlegen, die von launchd (und damit von Spotlight gestartet) verwendet wird launchctl setenv. Zum Beispiel um den Pfad zu setzen:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Oder wenn Sie Ihren Pfad einrichten möchten .bashrc oder ähnlich, dann habe ich es in launchd gespiegelt:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Es gibt keinen Neustart Allerdings müssen Sie eine App neu starten, wenn Sie möchten, dass die geänderte Umgebung übernommen wird.

Dies schließt alle Shells ein, die bereits unter Terminal.app ausgeführt werden. Wenn Sie jedoch dort sind, können Sie die Umgebung direkter einrichten, z. mit export PATH=/opt/local/bin:/opt/local/sbin:$PATH für bash oder zsh.

Wie behalte ich die Änderungen nach einem Neustart?

Zu behalte Änderungen nach einem Neustart bei Sie können die Umgebungsvariablen festlegen von /etc/launchd.conf, so:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf wird beim Neustart automatisch ausgeführt.

Wenn diese Änderungen jetzt wirksam werden sollen, sollten Sie diesen Befehl zur erneuten Verarbeitung verwenden launchctl.conf (Danke @mklement für den Tipp!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Sie können mehr darüber erfahren launchctl und wie es lädt launchd.conf mit dem Befehl man launchctl.


241
2017-09-21 01:23



Bis einschließlich Lion (10.7) können Sie sie einstellen

~ / .MacOSX / environment.plist

Sehen:

Für PATH im Terminal sollten Sie in der Lage sein .bash_profile oder .profile (Sie müssen es wahrscheinlich erstellen)

Für Berglöwen und darüber hinaus  Sie müssen verwenden launchd und launchctl


102
2017-09-25 20:08



Lösung für Kommandozeilen- und GUI-Apps aus einer Hand (funktioniert mit Yosemite & El Capitan)

Nehmen wir an, Sie haben Definitionen für Umgebungsvariablen 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 ein Starten Sie den Agenten Dies wird bei jeder Anmeldung und jederzeit bei Bedarf ausgeführt, wodurch diese Variablen in die Benutzersitzung geladen werden. Wir benötigen auch ein Shell-Skript, um diese Definitionen zu analysieren und notwendige Befehle zu erstellen, die vom Agenten ausgeführt werden.

Erstelle eine Datei mit plist Suffix (z. B. benannt osx-env-sync.plist) im ~/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 notwendig, das Shell-Skript mit a auszuführen Login-Shell damit ~/.bash_profile wird an erster Stelle bezogen, bevor dieses Skript ausgeführt wird.

Jetzt das Shell-Skript. Erstelle es bei ~/.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 Start-Agent für die aktuelle Sitzung:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Re) Starten Sie eine GUI-Anwendung und vergewissern Sie sich, dass sie die Umgebungsvariablen lesen kann.

Das Setup ist persistent. Es wird Neustarts und Neuanmeldungen überleben.

Nach der Ersteinrichtung (die Sie gerade gemacht haben), wenn Sie Änderungen in Ihrem ~/.bash_profile zu deiner ganzen Umgebung wieder, rununning die launchctl load ... Befehl führt nicht aus, was Sie wollen; stattdessen erhalten Sie eine Warnung wie folgt:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

Um Ihre Umgebungsvariablen neu zu laden, ohne den Abmelde- / Anmeldeprozess zu durchlaufen, gehen Sie folgendermaßen vor:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

Stellen Sie sicher, dass Sie Ihre bereits laufenden Anwendungen (einschließlich Terminal.app) neu starten, um sie auf die Änderungen aufmerksam zu machen.

Ich habe den Code und die Erklärungen hier auch auf 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).


56
2017-09-04 20:06



1.

vim ~/.bash_profile

Die Datei existiert möglicherweise nicht (wenn nicht, können Sie sie einfach erstellen).

2. Tippen Sie darin und speichern Sie die Datei:

export PATH=$PATH:YOUR_PATH_HERE

3.run

source ~/.bash_profile

46
2017-11-25 04:29



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

Verwenden Sie beim Aufrufen von Programmen vom Dock aus ~/.MacOSX/environment.plist bei dem die <dict> Element enthält eine Sequenz von <key>KEY</key><string>theValue</string> Elemente.

Stellen Sie beim Aufruf von Programmen von Spotlight sicher, dass launchd ausgeführt wurde Setup mit allen erforderlichen Schlüssel / Wert-Einstellungen.

Um beide Probleme gleichzeitig zu lösen, benutze ich einen Login-Eintrag (gesetzt über den Systemeinstellungen) auf meinem Benutzerkonto. Das Login-Element ist ein Bash-Skript ruft eine Emacs-Lisp-Funktion auf, obwohl man natürlich ihre verwenden kann Lieblings-Scripting-Tool, um das Gleiche zu erreichen. Dieser Ansatz hat den zusätzlichen Vorteil, dass es jederzeit funktioniert und kein benötigt Neustart, d. h. man kann bearbeiten ~/.profileFühren Sie das Anmeldeelement in einer Shell aus, und zeigen Sie die Änderungen für neu aufgerufene Programme im Dock oder im Spotlight an.

Einzelheiten:

Login Artikel: ~/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)))

ANMERKUNG: Diese Lösung ist eine Mischung aus denen, die kommen, bevor ich meine hinzugefügt habe, insbesondere die, die von Matt Curtis angeboten wurde, aber ich habe bewusst versucht, meine zu behalten ~/.bash_profile Inhaltsplattform unabhängig und setzen die Einstellung der launchd Umgebung (eine Nur-Mac-Einrichtung) in ein separates Skript.


33
2018-03-26 20:03



Eine andere, freie, opensource, Mac OSX Mountain Lion (10.8) Preference-Bereich / environment.plist Lösung ist EnvPane.

EnvPane's Quellcode verfügbar auf Github. EnvPane sieht aus wie vergleichbare Funktionen RCE-Umgebunges scheint jedoch, dass es seine gespeicherten Variablen sofort aktualisieren kann, d.h. ohne die Notwendigkeit für einen Neustart oder Login, das ist willkommen.

Wie vom Entwickler angegeben:

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

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

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


21
2018-01-15 14:04



Auf Berglöwen all /etc/paths und /etc/launchd.conf Die Bearbeitung hat keinen Effekt!

Apple Entwicklerforen sagen:

"Ändern Sie die Info.plist der .app selbst, um eine" LSEnvironment "zu enthalten   Wörterbuch mit den gewünschten Umgebungsvariablen.

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

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

Show Package Contents

und fügte ein neues Schlüssel / Diktat-Paar hinzu:

<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>

(sehen: LaunchServicesKeys Dokumentation bei Apple)

enter image description here

jetzt benutzt die App (in meinem Fall SourceTree) den angegebenen Pfad und arbeitet mit Git 1.9.3 :-)

PS: Natürlich müssen Sie den Pfadeintrag an Ihre spezifischen Pfadbedürfnisse anpassen.


17
2018-01-24 12:30



Obwohl die Antworten hier nicht "falsch" sind, füge ich noch einen hinzu: Änderungen der Umgebungsvariablen in OS X, die "alle Prozesse" betreffen, oder sogar außerhalb der Shell für alle Prozesse, die von einem bestimmten Benutzer interaktiv ausgeführt werden.

Meiner Erfahrung nach sind globale Änderungen an Umgebungsvariablen wie PATH für alle Prozesse unter OS X noch wahrscheinlicher als unter Windows. Viele OS X-Anwendungen und andere Software (einschließlich, vielleicht vor allem, Komponenten des Betriebssystems selbst) beruhen auf UNIX-Befehlszeilentools unter der Haube und übernehmen das Verhalten der Versionen dieser Werkzeuge, die mit dem System geliefert werden, und Verwenden Sie dabei nicht notwendigerweise absolute Pfade (ähnliche Kommentare gelten für dynamisch geladene Bibliotheken und DYLD_ * -Umgebungsvariablen). Stellen Sie sich zum Beispiel vor, dass die am höchsten bewerteten Antworten auf verschiedene Fragen zu Stack Overflow zum Ersetzen von von OS X bereitgestellten Versionen von Interpretern wie Python und Ruby allgemein lauten: "Tu dies nicht".

OS X unterscheidet sich in dieser Hinsicht nicht wesentlich von anderen UNIX-ähnlichen Betriebssystemen (z. B. Linux, FreeBSD und Solaris). Der wahrscheinlichste Grund, Apple bietet keine einfache Möglichkeit, dies zu tun, weil es ist bricht die Dinge. In dem Maße, in dem Windows nicht so anfällig für diese Probleme ist, liegt es an zwei Dingen: (1) Windows-Software ist nicht so sehr auf Kommandozeilen-Tools angewiesen wie UNIX-Software und (2) Microsoft Eine so umfangreiche Geschichte von "DLL-Hölle" und Sicherheitsprobleme verursacht durch Änderungen, die alle Prozesse betreffen, die das Verhalten des dynamischen Ladens in neueren Windows-Versionen geändert haben, um den Einfluss von "globalen" Konfigurationsoptionen wie PATH zu begrenzen.

"Lame" oder nicht, Sie haben ein weitaus stabileres System, wenn Sie solche Änderungen auf kleinere Bereiche beschränken.


16
2017-07-17 01:46



Manchmal funktionieren alle vorherigen Antworten einfach nicht. Wenn Sie Zugriff auf eine Systemvariable (wie M2_HOME) in Eclipse oder in IntelliJ haben wollen, ist das einzige, was in diesem Fall für mich funktioniert:

Zuerst (Schritt 1) ​​bearbeite /etc/launchd.conf, um eine Zeile wie diese zu enthalten: "setenv VAR value" und dann (Schritt 2) reboot.

Das einfache Modifizieren von .bash_profile funktioniert nicht, da in osx die Anwendungen nicht wie in anderen UNIX's gestartet werden, sondern sie die Eltern-Shell-Variablen nicht erben. Alle anderen Modifikationen funktionieren nicht aus einem mir unbekannten Grund. Vielleicht kann jemand anderes das klären.


15
2018-01-16 12:12