
Wie kann man Umgebungsvariablen in Mac OS X so einrichten, dass sie für GUI-Anwendungen verfügbar sind, ohne~/.MacOSX/environment.plistoderAnmelde-Hooks(da dieseveraltet)?
Antwort1
Auf Mountain Lion haben alle /etc/paths
Änderungen /etc/launchd.conf
keinerlei Auswirkungen!
In den Entwicklerforen von Apple heißt es:
„Ändern Sie die Info.plist der .app selbst, sodass 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/Wörterbuch-Paar hinzu mit dem Namen:
<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)
jetzt verwendet die App (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.
Antwort2
Die Lösung nutzt die Funktionalität von launchctl
, kombiniert mit einemAgent startenum die Login-Hooks von früher nachzuahmen. Weitere Lösungen, die den Store von verwenden launchd
, finden Sie unterdieser VergleichDer hier verwendete Launch Agent befindet sich in/Bibliothek/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 dieAusführen bei LadenSchlüssel, damit der Startagent zum frühestmöglichen Zeitpunkt ausgeführt wird. Die eigentliche Arbeit wird im Shell-Skript erledigt/Benutzer/Shared/conflaunchd.sh, die lautet~/.conf.launchdund gibt es weiter an launchctl
:
#! /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 Anruf von path_helper
zu bekommenWEGrichtig eingerichtet. Schließlich~/.conf.launchdsieht 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 bei mir einwandfrei (ich sollte erwähnen, dass ich immer noch Snow Leopard benutze), GUI-Anwendungen wieAbonnierenUndTeXShopkann meinen eigenen Tex-Baum sehen. Dinge, die verbessert werden können:
Das Shell-Skript enthält ein
#filename="$1"
. Das ist kein Zufall, da der Dateiname vom Startagenten als Argument an das Skript übergeben werden sollte, was aber nicht funktioniert.Wie erwähntHier(Deutsch und hinter einer Paywall!), ist es möglich, das Skript in den Startagenten selbst einzufügen.
Ich bin nicht sicher, wie sicher diese Lösung ist, da sie
eval
vom Benutzer bereitgestellte Zeichenfolgen verwendet.Ich meine mich zu erinnern, dass die Definition von MANPATH mit dieser Methode nicht gut funktioniert hat, aber ich bin nicht sicher.
Es sollte erwähnt werden, dass Apple einen ähnlichen Ansatz verfolgte, indem es Dinge in∼/launchd.conf, aber es wird derzeit für dieses Datum und Betriebssystem nicht unterstützt (siehe Manpage von launchd.conf
). Ich vermute, dass Dinge wie Globbing nicht so funktionieren würden, wie sie es in diesem Vorschlag tun. Und natürlich kann man diese Dateien überall sonst ablegen, außer im Startagenten, der sich in befinden muss/Bibliothek/LaunchAgents/oder~/Bibliothek/LaunchAgents/.
Abschließend möchte ich noch die Quellen erwähnen, die ich zur Information zu Launch Agents verwendet habe: 1,2,3,4.
Aktualisieren: Dies funktioniert derzeit in Version 10.8 nicht. Workarounds für einzelne Anwendungen sind beschriebenHierUndHier.
Antwort3
Die Antwort von @flori funktioniert bei mir auf Maverick, vorausgesetzt, ich führe die folgenden Befehle im 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
Antwort4
Eine andere Möglichkeit ist die Verwendung von /etc/launchd.conf
. Ich habe beispielsweise die Standardeinstellung geändert, PATH
indem ich diese Zeile hinzugefügt habe /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 /etc/launchd.conf
entweder durch einen Neustart oder durch Ausführen launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
, Beenden und Neustarten von Prozessen anwenden.
Einstellungen in /etc/launchd.conf
gelten sowohl für den Root-Launchd-Prozess als auch für benutzerspezifische Launchd-Prozesse. Mit setenv
in festgelegte Umgebungsvariablen werden sowohl durch als auch /etc/launchd.conf
angezeigt .sudo launchctl export
launchctl export