938 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).

691voto

Matthew McCullough Punkte 16494

Bruno ist genau auf dem richtigen Weg. Ich habe ausgiebig recherchiert und wenn Sie Variablen setzen wollen, die in allen GUI-Anwendungen verfügbar sind, ist Ihre einzige Option /etc/launchd.conf .

Bitte beachten Sie, dass environment.plist funktioniert nicht für Anwendungen, die über Spotlight gestartet werden. 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 den folgenden Inhalt 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 die grep / xargs Befehl, der im obigen Codekommentar gezeigt wird.

  5. Überprüfen Sie, ob Ihre Variablen funktionieren, indem Sie ein Terminal-Fenster öffnen und Folgendes eingeben export und Sie sollten Ihre neuen Variablen sehen. Diese werden auch in IntelliJ IDEA und anderen GUI-Anwendungen, die Sie über Spotlight starten, verfügbar sein.

315voto

Matt Curtis Punkte 22328

Erwarten Sie nicht, dass ~/.launchd.conf funktioniert

Die Manpage für launchctl sagt, dass es nie funktioniert hat:

VERALTETE UND ENTFERNTE FUNKTIONEN

launchctl verfügt nicht mehr über einen interaktiven Modus und akzeptiert auch keine Befehle von stdin. Die Datei /etc/launchd.conf wird nicht mehr für Unterbefehle konsultiert, die während des frühen Bootvorgangs ausgeführt werden sollen; diese Funktionalität wurde aus Sicherheitsgründen entfernt. Es war zwar dokumentiert, dass $HOME/.launchd.conf vor dem Einrichten einer Benutzersitzung konsultiert wird, aber diese Funktion wurde nie implementiert.

Wie man die Umgebung für neue, von Spotlight gestartete Prozesse einrichtet (ohne Neustart)

Sie können die Umgebung, die von launchd (und im weiteren Sinne von allem, was von Spotlight aus gestartet wird) verwendet wird, mit launchctl setenv . Zum Beispiel, um den Pfad festzulegen:

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

Oder wenn Sie Ihren Pfad in .bashrc oder ähnliches, und spiegeln Sie es dann in launchd:

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

Ein Neustart ist nicht erforderlich Allerdings müssen Sie eine Anwendung neu starten, damit sie die geänderte Umgebung aufnimmt.

Dies schließt alle Shells ein, die bereits unter Terminal.app laufen, obwohl Sie dort die Umgebung direkter einstellen können, z.B. mit export PATH=/opt/local/bin:/opt/local/sbin:$PATH für bash oder zsh.

Beibehaltung von Änderungen nach einem Neustart

Neue Methode (seit 10.10 Yosemite)

Utilisez launchctl config user path /bin:/usr/bin:/mystuff . Siehe man launchctl für weitere Informationen.

Vorherige Methode

Das Zitat aus der launchctl-Manualseite oben in dieser Antwort besagt, dass die hier beschriebene Funktion (Lesen /etc/launchd.conf beim Booten) wurde aus Sicherheitsgründen entfernt, daher: ymmv.

An Änderungen nach einem Neustart beibehalten können Sie die Umgebungsvariablen von /etc/launchd.conf , etwa so:

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

launchd.conf wird automatisch ausgeführt, wenn Sie neu starten.

Wenn Sie möchten, dass diese Änderungen jetzt wirksam werden, sollten Sie diesen Befehl verwenden, um die folgenden Daten neu zu verarbeiten launchd.conf (Danke @mklement für den Tipp!)

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

Sie können mehr erfahren über launchctl und wie sie geladen wird launchd.conf mit dem Befehl man launchctl .

109voto

tim_yates Punkte 160397

_Bis zu und einschließlich OS X v10.7 (Löwe)_ können Sie sie einrichten:

~/.MacOSX/environment.plist

Siehe:

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

_Pour OS X v10.8 (Mountain Lion) und darüber hinaus_ müssen Sie launchd y launchctl .

79voto

Ersin Er Punkte 1005

Lösung sowohl für Kommandozeilen- als auch für GUI-Anwendungen aus einer Hand (funktioniert mit Mac OS X v10.10 (Yosemite) und Mac OS X v10.11 (El Capitan))

Nehmen wir an, Sie haben Umgebungsvariablendefinitionen 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 eine Launch Agent die bei jeder Anmeldung und jederzeit bei Bedarf ausgeführt wird, um diese Variablen in die Benutzersitzung zu laden. Außerdem benötigen wir ein Shell-Skript, das diese Definitionen analysiert und die notwendigen Befehle erstellt, die vom Agenten ausgeführt werden.

Erstellen Sie eine Datei mit plist Suffix (z.B. named osx-env-sync.plist ) in ~/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 ist hier entscheidend; er ist notwendig für die Ausführung des Shell-Skripts mit einer Login-Hülle so dass ~/.bash_profile vor der Ausführung dieses Skripts beschafft wird.

Und nun das Shell-Skript. Erstellen Sie es unter ~/.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 Startagenten für die aktuelle Sitzung:

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

Starten Sie eine GUI-Anwendung (erneut) und überprüfen Sie, ob sie die Umgebungsvariablen lesen kann.

Die Einrichtung ist hartnäckig. Sie übersteht Neustarts und Neuanmeldungen.

Wenn Sie nach der Ersteinrichtung (die Sie gerade vorgenommen haben) Änderungen an Ihren ~/.bash_profile auf Ihre gesamte Umgebung zu übertragen, indem Sie die launchctl load ... führt nicht das aus, was Sie wollen; stattdessen erhalten Sie eine Warnung wie die folgende:

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

Um Ihre Umgebungsvariablen neu zu laden, ohne den Logout/Login-Prozess zu durchlaufen, gehen Sie wie folgt vor:

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

Stellen Sie abschließend sicher, dass Sie Ihre bereits laufenden Anwendungen (einschließlich Terminal.app) neu starten, damit sie von den Änderungen Kenntnis erhalten.

Ich habe den Code und die Erklärungen hier auch in ein GitHub-Projekt verschoben: 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).

62voto

WoooHaaaa Punkte 18268
  1. Machen:

    vim ~/.bash_profile

    Die Datei darf nicht existieren (falls nicht, können Sie sie einfach erstellen).

  2. Geben Sie dies ein und speichern Sie die Datei:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Laufen lassen

    source ~/.bash_profile

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