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 )?
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 )?
Antworten:
Auf Mountain Lion hat all das /etc/paths
und die /etc/launchd.conf
Bearbeitung 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
")
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 )
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.
Info.plist
wirksam werden.
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 launchctl
Befehle. 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:
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.
Wie hier erwähnt (deutsch und hinter einer Paywall!), Ist es möglich, das Skript selbst in den Launch Agent zu stellen.
Ich bin nicht sicher, wie sicher diese Lösung ist, da sie eval
mit vom Benutzer bereitgestellten Zeichenfolgen verwendet wird.
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 .
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_helper
im Shell-Skript aufgerufen wird. Weitere Informationen zur PATH-Variablen in OS X finden Sie in dieser Antwort .
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
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 0
und 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 Finder
kann dies ebenfalls hinzugefügt werden.
In der .bash_profile
benutze 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.
Eine andere Option ist zu verwenden /etc/launchd.conf
. Zum Beispiel habe ich die Standardeinstellung geändert, PATH
indem 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.conf
indem Sie entweder neu starten oder launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
Prozesse ausführen und beenden und neu starten.
Die Einstellungen /etc/launchd.conf
gelten sowohl für den Root-Launchd-Prozess als auch für den Pro-Benutzer-Launchd-Prozess. Umgebungsvariablen mit Set setenv
in /etc/launchd.conf
durch beide gezeigt sudo launchctl export
und launchctl export
.