Festlegen von Umgebungsvariablen in OS X für GUI-Anwendungen

18

Wie richtet man Umgebungsvariablen in Mac OS X so ein, dass sie für GUI-Anwendungen verfügbar sind, ohne ~ / .MacOSX / environment.plist oder Anmelde- Hooks zu verwenden (da diese veraltet sind )?

Percival Ulysses
quelle
@ ersin-er Die Antwort von StackOverflow "Lösung für Befehlszeilen- und GUI-Apps aus einer Hand (funktioniert mit Yosemite und El Capitan)" ist möglicherweise für Personen interessant, die diese Frage finden.
l

Antworten:

16

Auf Mountain Lion hat all das /etc/pathsund die /etc/launchd.confBearbeitung keine Auswirkung!

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 die App direkt bearbeitet Info.plist(Rechtsklick auf "AppName.app" (in diesem Fall SourceTree) und dann " Show package contents")

Paketinhalt anzeigen

und fügte ein neues Schlüssel / Dikt-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>

(siehe: LaunchServicesKeys-Dokumentation bei Apple )

Bildbeschreibung hier eingeben

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 Pfadanforderungen anpassen.

Flori
quelle
1
Vielen Dank! Das war perfekt für mich. Am 10.11 (El Capitan) musste ich auch die Befehle von Matthew ausführen, damit meine Änderungen Info.plistwirksam werden.
Dsedivec
8

Die Lösung nutzt die Funktionalität von launchctl, kombiniert mit einem Launch Agent , um die Anmelde-Hooks alter Zeiten nachzuahmen. Informationen zu anderen Lösungen, die den Store von verwenden launchd, finden Sie in diesem Vergleich . Der hier verwendete Launch Agent befindet sich in / Library / LaunchAgents / :

<?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>user.conf.launchd</string>
    <key>Program</key>
    <string>/Users/Shared/conflaunchd.sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>~/.conf.launchd</string>
    </array>
    <key>EnableGlobbing</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>LimitLoadToSessionType</key>
    <array>
        <string>Aqua</string>
        <string>StandardIO</string>
    </array>
</dict>
</plist>

Eine wichtige Sache ist der RunAtLoad- Schlüssel, damit der Startagent zum frühestmöglichen Zeitpunkt ausgeführt wird. Die eigentliche Arbeit wird im Shell-Skript /Users/Shared/conflaunchd.sh erledigt , das ~ / .conf.launchd liest und an folgende Adresse weiterleitetlaunchctl :

#! /bin/bash

#filename="$1"
filename="$HOME/.conf.launchd"

if [ ! -r "$filename" ]; then
    exit
fi

eval $(/usr/libexec/path_helper -s)

while read line; do
    # skip lines that only contain whitespace or a comment
    if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi

    eval launchctl $line
done <"$filename"

exit 0

Beachten Sie den Aufruf von path_helper, um PATH richtig einzurichten. Schließlich sieht ~ / .conf.launchd so aus

setenv PATH ~/Applications:"${PATH}"

setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:

# Locale
setenv LANG en_US.UTF-8

Dies sind launchctlBefehle. Weitere Informationen finden Sie in der Manpage. Funktioniert gut für mich (ich sollte erwähnen, dass ich immer noch ein Snow Leopard-Typ bin), GUI-Anwendungen wie texstudio und TeXShop können meinen eigenen tex-Baum sehen. Dinge, die verbessert werden können:

  1. Das Shell-Skript enthält ein #filename="$1". Dies ist kein Zufall, da der Dateiname vom Startagenten als Argument in das Skript eingegeben werden sollte, aber das funktioniert nicht.

  2. Wie hier erwähnt (deutsch und hinter einer Paywall!), Ist es möglich, das Skript selbst in den Launch Agent zu stellen.

  3. Ich bin nicht sicher, wie sicher diese Lösung ist, da sie evalmit vom Benutzer bereitgestellten Zeichenfolgen verwendet wird.

  4. Ich denke daran zu erinnern, dass die Definition von MANPATH mit dieser Methode nicht gut funktioniert hat, aber ich bin mir nicht sicher.

Es sollte erwähnt werden, dass Apple mit ∼ / launchd.conf einen etwas ähnlichen Ansatz verfolgt hat , diesbezüglich werden jedoch Datum und Betriebssystem derzeit nicht unterstützt (siehe die Manpage von launchd.conf). Ich denke, dass Dinge wie Globbing nicht so funktionieren würden wie in diesem Vorschlag. Und natürlich kann man diese Dateien an einer anderen Stelle ablegen , mit Ausnahme des Startagenten , der sich in / Library / LaunchAgents / oder ~ / Library / LaunchAgents / befinden muss .

Abschließend sollte ich die Quellen erwähnen, die ich als Informationen zu Launch Agents verwendet habe: 1 , 2 , 3 , 4 .

Update : Dies funktioniert derzeit nicht in Version 10.8. Problemumgehungen für jede Anwendung werden hier und hier beschrieben .

Percival Ulysses
quelle
Übrigens, wenn man die PATH-Variable in einer Terminal-Umgebung definieren möchte und diesen export PATH=.:"$(launchctl getenv PATH)"Startagenten verwendet, schlage ich vor, in ~ / .bash_profile zu schreiben (ähnlich wie bei anderen Shells). Dies ist möglich, da path_helperim Shell-Skript aufgerufen wird. Weitere Informationen zur PATH-Variablen in OS X finden Sie in dieser Antwort .
Percival Ulysses
3

Die Antwort von @flori funktioniert für Maverick, vorausgesetzt, ich führe die folgenden Befehle in Terminal aus, nachdem ich die plist-Datei geändert habe

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder
Matthew
quelle
Ich hatte das gleiche Verhalten mit El Capitan und ich habe Ihren Punkt zu @ floris Antwort hinzugefügt
Seki
2

Die Antwort von @ percival-ulysses funktioniert für mich unter 10.9 Mavericks mit der folgenden kleinen Änderung: Bearbeiten Sie das Skript /Users/Shared/conflaunchd.sh direkt vor exit 0und fügen Sie die Zeilen hinzu

killall Dock
killall SystemUIServer

um das Dock und die Menüleiste neu zu starten. Danach erben die vom Dock oder von Spotlight aus gestarteten Anwendungen den richtigen PATH. Wenn Sie den Finder verwenden, um die PATH-kritischen Anwendungen zu starten, killall Finderkann dies ebenfalls hinzugefügt werden.

In der .bash_profilebenutze ich die Leitung

export PATH=`launchctl getenv PATH`

Um den Pfad für das Terminal festzulegen , wird der Pfad vom selben Ort aus gesteuert, der ~ / .conf.launchd- Datei.

Ury Marshak
quelle
0

Eine andere Option ist zu verwenden /etc/launchd.conf. Zum Beispiel habe ich die Standardeinstellung geändert, PATHindem ich diese Zeile hinzugefügt habe zu /etc/launchd.conf:

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

Sie können Änderungen anwenden, /etc/launchd.confindem Sie entweder neu starten oder launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confProzesse ausführen und beenden und neu starten.

Die Einstellungen /etc/launchd.confgelten sowohl für den Root-Launchd-Prozess als auch für den Pro-Benutzer-Launchd-Prozess. Umgebungsvariablen mit Set setenvin /etc/launchd.confdurch beide gezeigt sudo launchctl exportund launchctl export.

Lri
quelle