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

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

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.confkeinerlei 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“)

Paketinhalt anzeigen

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)

Bildbeschreibung hier eingeben

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_helperzu 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 launchctlBefehle, 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:

  1. 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.

  2. Wie erwähntHier(Deutsch und hinter einer Paywall!), ist es möglich, das Skript in den Startagenten selbst einzufügen.

  3. Ich bin nicht sicher, wie sicher diese Lösung ist, da sie evalvom Benutzer bereitgestellte Zeichenfolgen verwendet.

  4. 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, PATHindem 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.confentweder 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.confgelten sowohl für den Root-Launchd-Prozess als auch für benutzerspezifische Launchd-Prozesse. Mit setenvin festgelegte Umgebungsvariablen werden sowohl durch als auch /etc/launchd.confangezeigt .sudo launchctl exportlaunchctl export

verwandte Informationen