wake-up-neo.com

Festlegen von Umgebungsvariablen unter OS X

Wie können Umgebungsvariablen wie PATH in OS X richtig geändert werden?

Ich habe ein bisschen bei Google nachgesehen und drei verschiedene Dateien zum Bearbeiten gefunden:

  • / etc/path
  • ~/.profile
  • ~/.tcshrc

Ich habe nicht einmal einige dieser Dateien und ich bin mir ziemlich sicher, dass . Tcshrc falsch ist, da OS X jetzt bash verwendet. Wo sind diese Variablen, insbesondere PATH, definiert?

Ich verwende OS X 10.5 (Leopard).

830
Paul Wicks

Bruno ist auf dem richtigen Weg. Ich habe umfangreiche Recherchen durchgeführt und wenn Sie Variablen festlegen möchten, die in allen GUI-Anwendungen verfügbar sind, ist Ihre einzige Option /etc/launchd.conf.

Bitte beachten Sie, dass environment.plist nicht für Anwendungen funktioniert, die über Spotlight gestartet wurden. Dies wird von Steve Sexton hier dokumentiert .

  1. Öffnen Sie eine Terminal-Eingabeaufforderung

  2. Typ 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 environment 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 Codekommentar angegeben ist.

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

643

Festlegen der Umgebung für neue Prozesse, die von Spotlight gestartet wurden (ohne dass ein Neustart erforderlich ist)

Sie können mit launchctl setenv die Umgebung festlegen, die von launchd (und damit auch von allem, was in Spotlight gestartet wurde) verwendet wird. So legen Sie beispielsweise den Pfad fest:

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

Oder wenn Sie Ihren Pfad in .bashrc oder ähnlichem einrichten möchten, lassen Sie ihn in launchd spiegeln:

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

Es ist kein Neustart erforderlich Sie müssen jedoch eine App neu starten, wenn Sie möchten, dass sie die geänderte Umgebung aufnimmt.

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 festlegen, z. mit export PATH=/opt/local/bin:/opt/local/sbin:$PATH für bash oder zsh.

Behalten Sie die Änderungen nach einem Neustart bei

Um Änderungen nach einem Neustart beizubehalten können Sie die Umgebungsvariablen von /etc/launchd.conf wie folgt festlegen:

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 verwenden, um launchctl.conf erneut zu verarbeiten (danke @mklement für den Tipp!)

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

Mehr über launchctl und wie es launchd.conf lädt, erfahren Sie mit dem Befehl man launchctl.

255
Matt Curtis

Bis einschließlich OS X 10.7 (Lion) Sie kann sie einstellen in:

~/.MacOSX/environment.plist

Sehen:

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

Für OS X 10.8 (Mountain Lion) und darüber hinaus - Sie müssen launchd und launchctl verwenden .

106
tim_yates

Lösung für Befehlszeilen- und GUI-Anwendungen aus einer Hand (funktioniert mit Mac OS X 10.1 (Yosemite) und Mac OS X 10.11 (El Capitan))

Nehmen wir an, Sie haben Umgebungsvariablendefinitionen in Ihrem ~/.bash_profile wie 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 jedem Login und jederzeit bei Bedarf 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 sollen.

Erstellen Sie eine Datei mit dem Suffix plist (z. B. mit dem Namen osx-env-sync.plist) im Verzeichnis ~/Library/LaunchAgents/ 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>

Der Parameter -l ist hier von entscheidender Bedeutung. Es ist erforderlich, um das Shell-Skript mit einer Login-Shell auszuführen, damit ~/.bash_profile als erstes aufgerufen wird, bevor dieses Skript ausgeführt wird.

Nun 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 jetzt den Startagenten für die aktuelle Sitzung:

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

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

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

Wenn Sie nach der erstmaligen Einrichtung (die Sie gerade vorgenommen haben) Änderungen in Ihrem ~/.bash_profile wieder auf Ihre gesamte Umgebung anwenden möchten, wird der Befehl launchctl load ... nicht ausgeführt, 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-/Anmeldeprozess 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 laufenden 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 auf ein GitHub-Projekt übertragen: osx-env-sync .

Ich hoffe, dies wird die ultimative Lösung sein, zumindest für die neuesten Versionen von OS X (Yosemite & El Capitan).

64
Ersin Er
  1. Machen:

    vim ~/.bash_profile
    

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

  2. Tippe dies ein und speichere die Datei:

    export PATH=$PATH:YOUR_PATH_HERE
    
  3. Lauf

    source ~/.bash_profile
    
51
MrROY

Beim Umgang mit Umgebungsvariablen in OS X sind im Wesentlichen zwei Probleme zu lösen. Das erste Problem tritt beim Aufrufen von Programmen über Spotlight (das Lupensymbol auf der rechten Seite des Mac-Menüs/der Statusleiste) und das zweite beim Aufrufen von Programmen über das Dock auf . Das Aufrufen von Programmen aus einer Terminal-Anwendung/einem Terminal-Dienstprogramm ist trivial, da die Umgebung von den Standard-Shell-Speicherorten gelesen wird (~/.profile, ~/.bash_profile, ~/.bashrc usw.).

Verwenden Sie zum Aufrufen von Programmen über das Dock ~/.MacOSX/environment.plist, wobei das <dict> -Element eine Folge von <key>KEY</key><string>theValue</string> -Elementen enthält.

Stellen Sie beim Aufrufen von Programmen über Spotlight sicher, dass launchd mit allen erforderlichen Schlüssel-/Werteinstellungen eingerichtet wurde.

Um beide Probleme gleichzeitig zu lösen, verwende ich in meinem Benutzerkonto ein Anmeldeelement (das über die Systemeinstellungen festgelegt wurde). Das Anmeldeelement ist ein Bash-Skript, das eine Emacs LISP-Funktion aufruft, obwohl man natürlich auch das bevorzugte Skriptwerkzeug verwenden kann, um das Gleiche zu erreichen. Dieser Ansatz hat den zusätzlichen Vorteil, dass er jederzeit funktioniert und keinen Neustart erfordert, dh, man kann ~/.profile bearbeiten, das Anmeldeelement in einer Shell ausführen und die Änderungen für neu aufgerufene Programme entweder vom Dock aus sichtbar machen oder Spotlight.

Einzelheiten:

Anmeldungsgegenstand: ~/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: Bei dieser Lösung handelt es sich um eine Mischung aus den Lösungen, die ich vor dem Hinzufügen von Matt Curtis vorgestellt habe. Ich habe jedoch bewusst versucht, meine Inhaltsplattform ~/.bash_profile unabhängig zu halten und die Einstellung der Umgebung launchd vorzunehmen (nur für Mac) in ein separates Skript.

34
pajato0

Eine weitere kostenlose OpenSource-Lösung für Mac OS X 10.8 (Mountain Lion) im Einstellungsbereich/environment.plist ist EnvPane .

EnvPanes Quellcode verfügbar auf GitHub . EnvPane hat anscheinend vergleichbare Funktionen wie RCEnvironment , es scheint jedoch, dass es seine gespeicherten Variablen sofort aktualisieren kann, dh ohne Notwendigkeit für einen Neustart oder Login, was willkommen ist.

Wie vom Entwickler angegeben:

EnvPane ist ein Einstellungsbereich für Mac OS X 10.8 (Mountain Lion), in dem Sie Umgebungsvariablen für alle Programme sowohl in Grafik- als auch in Terminalsitzungen festlegen können. Es wird nicht nur die Unterstützung für ~/.MacOSX/environment.plist in Mountain Lion wiederhergestellt, sondern es werden auch Ihre Änderungen sofort in der Umgebung veröffentlicht, ohne dass Sie sich abmelden und erneut anmelden müssen. <SNIP> EnvPane enthält a Startet den Agenten, der 1) früh nach der Anmeldung und 2) immer dann ausgeführt wird, wenn sich die ~/.MacOSX/environment.plist ändert. Der Agent liest ~/.MacOSX/environment.plist und exportiert die Umgebungsvariablen aus dieser Datei über dieselbe API, die von launchctl setenv und launchctl unsetenv verwendet wird, in die launchd-Instanz des aktuellen Benutzers.

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

P.S. Ich mag den Namen (hört sich an wie 'Ends Pain').

22
Big Rich

Auf Mountain Lion hat die gesamte Bearbeitung von /etc/paths und /etc/launchd.conf keinen Effekt!

Apples Entwicklerforen sagen:

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

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

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

Show Package Contents

Und ich habe ein neues Schlüssel/Dikt-Paar hinzugefügt:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/Ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/[email protected]/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 spezifischen Pfadanforderungen anpassen.

17
Flori

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

Nach meiner Erfahrung können globale Änderungen an Umgebungsvariablen wie PATH für alle Prozesse unter OS X noch häufiger zu Problemen führen als unter Windows. Grund dafür ist, dass viele OS X-Anwendungen und andere Software (einschließlich möglicherweise besonders Komponenten des Betriebssystems selbst) auf UNIX-Befehlszeilentools unter der Haube angewiesen sind und das Verhalten der Versionen dieser Tools annehmen, die mit dem System bereitgestellt werden Verwenden Sie dabei nicht unbedingt absolute Pfade (ähnliche Kommentare gelten für dynamisch geladene Bibliotheken und DYLD_ * -Umgebungsvariablen). Denken Sie beispielsweise daran, dass die bestbewerteten Antworten auf verschiedene Fragen zum Stapelüberlauf beim Ersetzen von von OS X bereitgestellten Versionen von Interpretern wie Python und Ruby im Allgemeinen sagen: "Tun Sie dies 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 Dinge kaputt macht. In dem Maße, in dem Windows für diese Probleme nicht so anfällig ist, liegt dies an zwei Dingen: (1) Windows-Software ist in dem Maße, in dem dies bei UNIX-Software der Fall ist, nicht auf Befehlszeilentools angewiesen, und (2) Microsoft hat dies getan Eine derart umfangreiche Historie von DLL-Höllen- und Sicherheitsproblemen, die durch Änderungen verursacht wurden, die sich auf alle Prozesse auswirken, die das Verhalten des dynamischen Ladens in neueren Windows-Versionen geändert haben, um die Auswirkungen von "globalen" Konfigurationsoptionen wie PATH zu begrenzen.

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

16
Jason T. Miller

Aktualisierung (2017-08-04)

Ab (mindestens) macOS 10.12.6 (Sierra) scheint diese Methode für Apache httpd nicht mehr zu funktionieren (sowohl für die Option system als auch für die Option user von launchctl config). Andere Programme scheinen nicht betroffen zu sein. Es ist denkbar, dass dies ein Fehler in httpd ist.

Ursprüngliche Antwort

Dies betrifft OS X 10.10+ (10.11+, insbesondere aufgrund des rootless-Modus, in dem /usr/bin nicht mehr beschreibbar ist).

Ich habe an mehreren Stellen gelesen, dass die Verwendung von launchctl setenv PATH <new path> zum Festlegen der PATH -Variable aufgrund eines Fehlers in OS X (der aus persönlicher Erfahrung wahr zu sein scheint) nicht funktioniert. Ich habe festgestellt, dass es einen anderen Weg gibt, wie PATH gesetzt werden kann für Anwendungen, die nicht über die Shell gestartet werden:

Sudo launchctl config user path <new path>

Diese Option ist in der launchctl-Manpage dokumentiert:

konfigurationssystem | Benutzerparameterwert

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

[...]

pfad

Legt die Umgebungsvariable PATH für alle Dienste in der Zieldomäne auf den Zeichenfolgenwert fest. Der Zeichenfolgenwert muss dem Format entsprechen, das für die Umgebungsvariable PATH in environ (7) angegeben wurde. Beachten Sie, dass die dienstspezifische Umgebungsvariable Vorrang hat, wenn ein Dienst seinen eigenen PFAD angibt.

ANMERKUNG: Mit dieser Funktion können keine allgemeinen Umgebungsvariablen für alle Dienste in der Domäne festgelegt werden. Es ist absichtlich auf die Variable PATH und aus Sicherheitsgründen auf nichts anderes beschränkt.

Ich habe bestätigt, dass dies mit einer vom Finder gestarteten GUI-Anwendung funktioniert (die getenv verwendet, um PATH abzurufen). Beachten Sie, dass Sie dies nur einmal tun müssen und die Änderung durch Neustarts erhalten bleibt.

15
Max Leske

Manchmal funktionieren alle vorherigen Antworten einfach nicht. Wenn Sie Zugriff auf eine Systemvariable (wie M2_HOME) in Eclipse oder in IntelliJ IDEA haben möchten, funktioniert in diesem Fall nur Folgendes:

Bearbeiten Sie zuerst (Schritt 1) ​​/etc/launchd.conf, um eine Zeile wie die folgende zu enthalten: "setenv VAR value", und starten Sie dann (Schritt 2) neu.

Das einfache Ändern von .bash_profile funktioniert nicht, da die Anwendungen unter OS X nicht wie unter anderen Unix-Betriebssystemen gestartet werden. Sie erben nicht die Shell-Variablen der Eltern. Alle anderen Änderungen funktionieren aus einem mir unbekannten Grund nicht. Vielleicht kann jemand anderes das klären.

15

Nachdem ich den Einstellungsbereich mgebungsvariablen durchgesehen und festgestellt habe, dass der Link nicht mehr funktioniert und eine Suche auf der Apple-Website darauf hindeutet, dass sie ihn vergessen haben ... bin ich wieder dem schwer fassbaren Startprozess auf den Grund gegangen .

Auf meinem System (Mac OS X 10.6.8) scheinen die in environment.plist definierten Variablen zuverlässig in Apps exportiert zu werden, die von Spotlight aus (über launchd) gestartet wurden. Mein Problem ist, dass diese Variablen nicht in neue Bash-Sitzungen in Terminal exportiert werden. Das heißt Ich habe das gegenteilige Problem, wie es hier dargestellt ist.

HINWEIS: Die Datei environment.plist sieht aus wie JSON und nicht wie zuvor beschrieben wie XML

Ich konnte Spotlight-Apps dazu bringen, die Variablen anzuzeigen, indem ich Bearbeitung von ~/MacOSX/environment.plist und konnte Erzwingen Sie die gleichen Variablen in einer neuen Terminal-Sitzung, indem Sie meiner .profile-Datei Folgendes hinzufügen:

eval $(launchctl export)
13
Russell B

Alle Bash-Startdateien - ~/.bashrc, ~/.bash_profile, ~/.profile. Es gibt auch eine seltsame Datei namens ~/.MacOSX/environment.plist für Umgebungsvariablen in GUI-Anwendungen.

10
John Millikin

Hier ist eine sehr einfache Möglichkeit, das zu tun, was Sie wollen. In meinem Fall wurde Gradle zum Laufen gebracht (für Android Studio).

  • Öffnen Sie das Terminal.
  • Führen Sie den folgenden Befehl aus:

    Sudo nano /etc/paths oder Sudo vim /etc/paths

  • Geben Sie Ihr Passwort ein, wenn Sie dazu aufgefordert werden.

  • Gehen Sie zum Ende der Datei und geben Sie den Pfad ein, den Sie hinzufügen möchten.
  • Schlagen Control + X beenden.
  • Geben Sie 'Y' ein, um den geänderten Puffer zu speichern.
  • Öffnen Sie ein neues Terminalfenster und geben Sie Folgendes ein:

    echo $PATH

Sie sollten den neuen Pfad sehen, der an das Ende des PFADES angehängt wird.

Ich habe diese Details aus diesem Beitrag erhalten:

Zum PFAD hinzufügen unter Mac OS X 10.8 Mountain Lion und höher

10
wired00

Ähnlich wie die Antwort, die Matt Curtis gegeben hat, habe ich Umgebungsvariablen über launchctl festgelegt, aber ich verpacke sie in eine Funktion namens export, sodass sie bei jedem Export einer Variablen wie normal in mein .bash_profile auch von launchctl festgelegt wird. Folgendes mache ich:

  1. Mein .bash_profile besteht nur aus einer Zeile. (Dies ist nur eine persönliche Einstellung.)

    source .bashrc
    
  2. Mein .bashrc hat folgendes:

    function export()
    {
        builtin export "[email protected]"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        Elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${[email protected]}"
        fi
    }
    
    export -f export
    
  3. Das Obige überlastet den in Bash eingebauten "Export" und exportiert alles normal (Sie werden bemerken, dass ich "Export" damit exportiere!) Und stellt sie dann ordnungsgemäß für OS X-App-Umgebungen über launchctl ein, unabhängig davon, ob Sie eine der folgenden Optionen verwenden:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
    
  4. Auf diese Weise muss ich nicht jedes Mal jede Variable an launchctl senden, und ich kann einfach mein .bash_profile/.bashrc so einrichten, wie ich es möchte. Öffnen Sie ein Terminalfenster, überprüfen Sie Ihre gewünschten Umgebungsvariablen mit launchctl getenv myVar, ändern Sie etwas in Ihrem .bash_profile/.bashrc, schließen Sie das Terminalfenster und öffnen Sie es erneut, überprüfen Sie die Variable erneut mit launchctl und voilá, es hat sich geändert.

  5. Wie bei den anderen Lösungen für die Post-Mountain Lion-Welt müssen neue Umgebungsvariablen nach der Änderung gestartet oder neu gestartet werden, damit sie für Apps verfügbar sind.

10
courtlandj

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

Bitte schön:

http://www.Apple.com/de/downloads/macosx/system_disk_utilities/environmentvariablepreferencepane.html

8
Tom Teman

Um präzise und klar zu sein, wofür die einzelnen Dateien bestimmt sind

  • ~/.profile wird bei jedem Start von Terminal.app bereitgestellt
  • In ~/.bashrc werden "traditionell" alle Exportanweisungen für die Bash-Umgebung festgelegt
  • /etc/paths ist die Hauptdatei in Mac OS, die die Liste der Standardpfade zum Erstellen der Umgebungsvariablen PATH für alle Benutzer enthält
  • /etc/paths.d/ enthält Dateien, die zusätzliche Suchpfade enthalten

Nicht-Terminal-Programme erben nicht die systemweiten PATH- und MANPATH-Variablen, die Ihr Terminal verwendet! Um die Umgebung für alle von einem bestimmten Benutzer gestarteten Prozesse festzulegen und damit Umgebungsvariablen für Mac OS X-GUI-Anwendungen verfügbar zu machen, müssen diese Variablen in Ihrem ~/.MacOSX/environment.plist definiert werden (Apple Technical Q & A QA1067).

Verwenden Sie die folgende Befehlszeile, um Ihren environment.plist mit /etc/paths zu synchronisieren:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"
7

Die Variable $PATH unterliegt auch path_helper, die wiederum die Datei /etc/paths und die Dateien in /etc/paths.d verwendet.

Eine ausführlichere Beschreibung finden Sie in PATH und andere Umgebungsprobleme in Leopard (2008-11)

5
Nicolas Wu

/etc/launchd.conf wird unter OS X 10.10 (Yosemite), OS X 10.11 (El Capitan), MacOS 10.12 (Sierra) oder MacOS 10.13 (High Sierra) nicht verwendet.


Aus der Manpage launchctl:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

Die in dieser Ask Different answer beschriebene Methode funktioniert bei mir (nach einem Neustart): Anwendungen, die über das Dock oder über Spotlight gestartet wurden erben Umgebungsvariablen, die ich in ~/Library/LaunchAgents/my.startup.plist festgelegt habe. (In meinem Fall musste ich LANG für ein Sublime Text-Plugin auf en_US.UTF-8 setzen.)

4
David

Verwenden Sie für eine Einzelbenutzermodifikation ~/.profile der von Ihnen aufgelisteten. Der folgende Link erklärt, wann die verschiedenen Dateien von Bash gelesen werden.

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

Wenn Sie die Umgebungsvariable für GUI-Anwendungen festlegen möchten, benötigen Sie die Datei ~/.MacOSX/environment.plist

3
mmaibaum

Es ist einfach:

Bearbeiten Sie ~/.profile und setzen Sie Ihre Variablen wie folgt

$ vim ~/.profile

In die Datei legen:

MY_ENV_VAR = Wert

  1. Speichern (: wq)

  2. Starten Sie das Terminal neu (Beenden und öffnen Sie es erneut)

  3. Stellen Sie sicher, dass alles in Ordnung ist:

$ echo $ MY_ENV_VAR

$ value


3

Zusätzlich zu den vorgeschlagenen Ansätzen ist zu beachten, dass zumindest in OS X 10.5 (Leopard) die in launchd.conf festgelegten Variablen mit den in .profile vorgenommenen Einstellungen zusammengeführt werden. Ich nehme an, dass dies wahrscheinlich auch für die Einstellungen in ~/.MacOSX/environment.plist gilt, aber ich habe es nicht überprüft.

3
MiB

Richten Sie Ihre Umgebungsvariable PATH unter Mac OS ein

Öffnen Sie das Terminal-Programm (dieses befindet sich standardmäßig in Ihrem Ordner Programme/Dienstprogramme). Führen Sie den folgenden Befehl aus

touch ~/.bash_profile; open ~/.bash_profile

Dadurch wird die Datei in Ihrem Standardtexteditor geöffnet.

Für Android SDK als Beispiel:

Sie müssen den Pfad zu Ihrem Android SDK-Plattform-Tools- und Tools-Verzeichnis hinzufügen. In meinem Beispiel verwende ich "/ Development/Android-sdk-macosx" als Verzeichnis, in dem das SDK installiert ist. Fügen Sie die folgende Zeile hinzu:

export PATH=${PATH}:/Development/Android-sdk-macosx/platform-tools:/Development/Android-sdk-macosx/tools

Speichern Sie die Datei und beenden Sie den Texteditor. Führen Sie Ihr .bash_profile aus, um Ihren PATH zu aktualisieren:

source ~/.bash_profile

Jedes Mal, wenn Sie das Terminal-Programm öffnen, enthält Ihr PFAD das SDK Android.

3
Charaf JRA

Nun, ich bin mir nicht sicher, was die Dateien /etc/paths und ~/.MacOSX/environment.plist angeht. Die sind neu.

Bei Bash sollten Sie jedoch wissen, dass .bashrc bei jedem neuen Shell-Aufruf ausgeführt wird und .bash_profile beim Start nur einmal ausgeführt wird.

Ich weiß nicht, wie oft dies unter Mac OS X der Fall ist. Ich glaube, die Unterscheidung ist gescheitert, als das Fenstersystem alles gestartet hat.

Persönlich vermeide ich die Verwirrung, indem ich eine .bashrc -Datei mit allem erstelle, was ich brauche, und dann mache ich Folgendes:

ln -s .bashrc .bash_profile
3
mike511

Hab das einfach und schnell gemacht. Erstellen Sie zuerst ein ~/.bash_profile vom Terminal aus:

touch .bash_profile

dann

open -a TextEdit.app .bash_profile

hinzufügen

export Tomcat_HOME=/Library/Tomcat/Home

dokument speichern und fertig.

2
CodeOverRide

Login Shells

/etc/profile

Die Shell führt zuerst die Befehle in der Datei /etc/profile aus. Ein Benutzer, der mit Root-Rechten arbeitet, kann diese Datei so einrichten, dass systemweite Standardmerkmale für Benutzer festgelegt werden, die Bash ausführen.

.bash_profile
.bash_login
.profile

Als nächstes sucht die Shell in dieser Reihenfolge nach ~/.bash_profile, ~/.bash_login und ~/.profile (~/steht für Ihr Ausgangsverzeichnis) und führt die Befehle in der ersten dieser Dateien aus findet. Sie können Befehle in eine dieser Dateien einfügen, um die in /etc/profile festgelegten Standardeinstellungen zu überschreiben. Eine Shell, die auf einem virtuellen Terminal ausgeführt wird, führt in diesen Dateien keine Befehle aus.

.bash_logout

Wenn Sie sich abmelden, führt bash Befehle in der Datei ~/.bash_logout aus. Diese Datei enthält häufig Befehle, die nach einer Sitzung bereinigt werden, z. B. zum Entfernen temporärer Dateien.

Interactive Nonlogin Shells

/etc/bashrc

Obwohl nicht direkt von bash aufgerufen, rufen viele ~/.bashrc -Dateien /etc/bashrc auf. Mit diesem Setup kann ein Benutzer, der mit Root-Rechten arbeitet, systemweite Standardmerkmale für nicht angemeldete Bash-Shells festlegen.

.bashrc

Eine interaktive Shell ohne Anmeldung führt Befehle in der Datei ~/.bashrc aus. In der Regel wird diese Datei von einer Startdatei für eine Anmeldeshell wie .bash_profile ausgeführt, sodass sowohl Anmelde- als auch Nicht-Anmeldeshell die Befehle in .bashrc ausführen.

Da Befehle in .bashrc möglicherweise mehrmals ausgeführt werden und Subshells exportierte Variablen erben, empfiehlt es sich, Befehle, die zu vorhandenen Variablen hinzugefügt werden, in die Datei .bash_profile einzufügen.

2
Koray Tugay

All die Magie unter iOS funktioniert nur mit der Verwendung von source für die Datei, in die Sie Ihre Umgebungsvariablen exportieren.

Zum Beispiel:

Sie können eine Datei wie folgt erstellen:

export bim=fooo
export bom=bar

Speichern Sie diese Datei als bimbom.env und führen Sie source ./bimbom.ev aus. Voilá, du hast deine Umgebungsvariablen.

Überprüfe sie mit:

echo $bim
2
suther

Hier gibt es zwei Arten von Muscheln.

  • Nicht-Login: .bashrc wird jedes Mal neu geladen, wenn Sie eine neue Kopie von Bash starten
  • Login: Das .profile wird nur geladen, wenn Sie sich entweder anmelden oder Bash explizit anweisen, es zu laden und als Login-Shell zu verwenden.

Hier ist es wichtig zu verstehen, dass mit Bash die Datei .bashrc nur von einer Shell gelesen wird, die sowohl interaktiv als auch nicht angemeldet ist, und Sie werden feststellen, dass Leute häufig .bashrc in .bash_profile laden, um zu überwinden diese Einschränkung.

Nachdem Sie das Grundverständnis haben, gehen wir nun zu dem Thema über, zu dem ich Ihnen raten würde, es einzurichten.

  • .profile: erstellen Sie es nicht vorhanden. Legen Sie dort Ihr PATH-Setup ab.
  • .bashrc: erstellen, falls nicht vorhanden. Fügen Sie alle Ihre Aliase und benutzerdefinierten Methoden ein.
  • .bash_profile: erstellen, falls nicht vorhanden. Geben Sie dort Folgendes ein.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#
2
ZOXIS

Es ist ganz einfach. Bearbeiten Sie die Datei .profile (vi, nano , Sublime Text oder einen anderen Texteditor). Sie finden es im Verzeichnis ~/ (Benutzerverzeichnis) und stellen es folgendermaßen ein:

export MY_VAR=[your value here]

Beispiel mit Java home:

export Java_HOME=/Library/Java/JavaVirtualMachines/current

Speichern Sie es und kehren Sie zum Terminal zurück.

Sie können es mit neu laden:

source .profile

Oder schließen und öffnen Sie Ihr Terminalfenster.

1
francois.robert

Fügen Sie für Bash Ihre Umgebungsvariablen zur Datei /etc/profile hinzu, um sie für alle Benutzer verfügbar zu machen. Kein Neustart erforderlich, starten Sie einfach eine neue Terminal-Sitzung.

1
Rabi