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 )?
macos
environment-variables
launchd
launchctl
Percival Ulisses
źródło
źródło
Odpowiedzi:
Na Mountain Lion wszystko
/etc/paths
i/etc/launchd.conf
edycja nie ma żadnego efektu!Fora programistów Apple mówią:
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:
(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.
źródło
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 sklepulaunchd
zobacz to porównanie . Używany tutaj agent uruchamiania znajduje się w / Library / LaunchAgents / :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
:Zwróć uwagę na wezwanie
path_helper
do prawidłowej konfiguracji PATH . Wreszcie ~ / .conf.launchd wygląda takSą 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 .
źródło
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
źródło
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 wierszeaby 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 liniiaby ustawić PATH dla terminala, w ten sposób PATH jest kontrolowany z tej samej lokalizacji, pliku ~ / .conf.launchd .
źródło
Inną opcją jest użycie
/etc/launchd.conf
. Na przykład zmieniłem domyślnąPATH
, dodając ten wiersz do/etc/launchd.conf
:Możesz zastosować zmiany
/etc/launchd.conf
, uruchamiając ponownie lub uruchamiająclaunchctl < /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 ustawionesetenv
w/etc/launchd.conf
są pokazane zarówno przez, jaksudo launchctl export
ilaunchctl export
.źródło