Ustawianie zmiennych środowiskowych w OS X dla aplikacji GUI

18

Jak skonfigurować zmienne środowiskowe w systemie Mac OS X, aby były one dostępne dla aplikacji GUI bez użycia ~ / .MacOSX / environment.plist lub haków logowania (ponieważ są one przestarzałe )?

Percival Ulisses
źródło
@ ersin-er Odpowiedź StackOverflow „Rozwiązanie zarówno dla aplikacji z linii poleceń, jak i GUI z jednego źródła (współpracuje z Yosemite i El Capitan)” może zainteresować osoby, które znajdą to pytanie.
l --marc l

Odpowiedzi:

16

Na Mountain Lion wszystko /etc/pathsi /etc/launchd.confedycja nie ma żadnego efektu!

Fora programistów Apple mówią:

„Zmień Info.plist samej aplikacji., Aby zawierała słownik„ LSEnvironment ”ze zmiennymi środowiskowymi, które chcesz.

~ / .MacOSX / environment.plist nie jest już obsługiwany. ”

Więc bezpośrednio edytowałem aplikację Info.plist(kliknij prawym przyciskiem „AppName.app” (w tym przypadku SourceTree), a następnie „ Show package contents”)

Pokaż Zawartość opakowania

i dodał nową parę klucz / dykt o nazwie:

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

(patrz: Dokumentacja LaunchServicesKeys w Apple )

wprowadź opis zdjęcia tutaj

teraz aplikacja (w moim przypadku SourceTree) korzysta z podanej ścieżki i działa z git 1.9.3 :-)

PS: Oczywiście musisz dostosować wpis Ścieżki do swoich specyficznych potrzeb.

Flori
źródło
1
Dziękuję Ci! To było dla mnie idealne. 10.11 (El Capitan) musiałem także uruchomić polecenia dostarczone przez Matthew , aby zobaczyć, jak moje zmiany Info.plistzaczną obowiązywać.
dsedivec
8

Rozwiązanie wykorzystuje funkcjonalność launchctl, w połączeniu z Launch Agent, aby naśladować stare haki logowania. W przypadku innych rozwiązań korzystających ze sklepu launchdzobacz to porównanie . Używany tutaj agent uruchamiania znajduje się w / 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>

Jedną ważną rzeczą jest klucz RunAtLoad , aby agent uruchamiania był uruchamiany możliwie jak najwcześniej. Prawdziwa praca jest wykonywana w skrypcie powłoki /Users/Shared/conflaunchd.sh , który odczytuje ~ / .conf.launchd i podaje go do 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

Zwróć uwagę na wezwanie path_helperdo prawidłowej konfiguracji PATH . Wreszcie ~ / .conf.launchd wygląda tak

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

Są to launchctlpolecenia, więcej informacji na jego stronie podręcznika. Działa dla mnie dobrze (muszę wspomnieć, że wciąż jestem facetem z Leoparda), aplikacje GUI, takie jak texstudio i TeXShop, mogą zobaczyć moje własne drzewo tex. Rzeczy, które można poprawić:

  1. Skrypt powłoki ma #filename="$1"w sobie. Nie jest to przypadkowe, ponieważ nazwa pliku powinna zostać przekazana do skryptu przez agenta uruchamiania jako argument, ale to nie działa.

  2. Jak wspomniano tutaj (niemiecki i za paywallem!), Możliwe jest umieszczenie skryptu w samym agencie uruchamiania.

  3. Nie jestem pewien, jak bezpieczne jest to rozwiązanie, ponieważ korzysta evalz ciągów podanych przez użytkownika.

  4. Myślę, że muszę pamiętać, że definicja MANPATH przy użyciu tej metody nie działała dobrze, ale nie jestem pewien.

Należy wspomnieć, że Apple zamierzał zastosować nieco podobne podejście, umieszczając pliki w ∼ / launchd.conf , ale obecnie nie jest ono obsługiwane w odniesieniu do tej daty i systemu operacyjnego (patrz strona podręcznika launchd.conf). Wydaje mi się, że takie rzeczy jak globbing nie działałyby tak jak w tym wniosku. I oczywiście można umieścić te pliki gdziekolwiek indziej, z wyjątkiem agenta uruchamiania, który musi znajdować się w / Library / LaunchAgents / lub ~ / Library / LaunchAgents / .

Na koniec powinienem wspomnieć o źródłach, które wykorzystałem jako informacje o Launch Agents: 1 , 2 , 3 , 4 .

Aktualizacja : Obecnie nie działa to w wersji 10.8. Obejścia dla poszczególnych aplikacji opisano tutaj i tutaj .

Percival Ulisses
źródło
Nawiasem mówiąc, jeśli ktoś chce zdefiniować zmienną PATH w środowisku terminalowym i korzysta z tego agenta uruchamiającego, proponuję napisać export PATH=.:"$(launchctl getenv PATH)"w ~ / .bash_profile (podobnie w przypadku innych powłok). Jest to możliwe, ponieważ path_helperjest wywoływane w skrypcie powłoki. Aby uzyskać więcej informacji na temat zmiennej PATH w OS X, sprawdź tę odpowiedź .
Percival Ulysses,
3

Odpowiedź udzielona przez @flori działa dla mnie w Maverick pod warunkiem, że uruchomię następujące polecenia w Terminalu po zmianie pliku plist

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

killall Finder
Mateusz
źródło
Zachowałem się tak samo z El Capitanem i dodałem twój punkt do odpowiedzi @ flori
Seki
2

Odpowiedź udzielona przez @ percival-ulysses działa dla mnie w wersji 10.9 Mavericks z następującą małą zmianą: edytuj skrypt /Users/Shared/conflaunchd.sh tuż przed exit 0i dodaj wiersze

killall Dock
killall SystemUIServer

aby ponownie uruchomić Dock i pasek menu. Następnie aplikacje uruchomione z Docka lub Spotlight odziedziczą poprawną ŚCIEŻKĘ. Jeśli używasz Findera do uruchamiania aplikacji krytycznych dla ŚCIEŻKI, killall Findermoże zostać również dodany.

W .bash_profileużywam linii

export PATH=`launchctl getenv PATH`

aby ustawić PATH dla terminala, w ten sposób PATH jest kontrolowany z tej samej lokalizacji, pliku ~ / .conf.launchd .

Ury Marshak
źródło
0

Inną opcją jest użycie /etc/launchd.conf. Na przykład zmieniłem domyślną PATH, dodając ten wiersz do /etc/launchd.conf:

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

Możesz zastosować zmiany /etc/launchd.conf, uruchamiając ponownie lub uruchamiając launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confi kończąc oraz ponownie uruchamiając procesy.

Ustawienia /etc/launchd.confdotyczą zarówno procesu uruchamiania root, jak i procesów uruchamiania dla użytkownika. Zmienne środowiskowe ustawione setenvw /etc/launchd.confsą pokazane zarówno przez, jak sudo launchctl exporti launchctl export.

Lri
źródło