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 )?
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 )?
Odpowiedzi:
Na Mountain Lion wszystko /etc/paths
i /etc/launchd.conf
edycja 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
”)
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 )
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.
Info.plist
zaczną obowiązywać.
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 launchd
zobacz 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_helper
do 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 launchctl
polecenia, 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ć:
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.
Jak wspomniano tutaj (niemiecki i za paywallem!), Możliwe jest umieszczenie skryptu w samym agencie uruchamiania.
Nie jestem pewien, jak bezpieczne jest to rozwiązanie, ponieważ korzysta eval
z ciągów podanych przez użytkownika.
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 .
export PATH=.:"$(launchctl getenv PATH)"
w ~ / .bash_profile (podobnie w przypadku innych powłok). Jest to możliwe, ponieważ path_helper
jest wywoływane w skrypcie powłoki. Aby uzyskać więcej informacji na temat zmiennej PATH w OS X, sprawdź tę odpowiedź .
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
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 0
i 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 Finder
może zostać również dodany.
W .bash_profile
uż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 .
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.conf
i kończąc oraz ponownie uruchamiając procesy.
Ustawienia /etc/launchd.conf
dotyczą zarówno procesu uruchamiania root, jak i procesów uruchamiania dla użytkownika. Zmienne środowiskowe ustawione setenv
w /etc/launchd.conf
są pokazane zarówno przez, jak sudo launchctl export
i launchctl export
.