Rozwiązanie dla aplikacji wiersza poleceń i GUI z jednego źródła (działa z Mac OS X 10.10 (Yosemite) i Mac OS X 10.11 (El Capitan))
Załóżmy, że masz takie definicje zmiennych środowiskowych ~/.bash_profile
w poniższym fragmencie:
export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
Potrzebujemy agenta uruchamiającego, który będzie działał przy każdym logowaniu i w dowolnym momencie na żądanie, aby załadować te zmienne do sesji użytkownika. Będziemy także potrzebować skryptu powłoki, aby przeanalizować te definicje i zbudować niezbędne polecenia do wykonania przez agenta.
Utwórz plik z plist
przyrostkiem (np. O nazwie osx-env-sync.plist
) w ~/Library/LaunchAgents/
katalogu o następującej treści:
<?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>osx-env-sync</string>
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-l</string>
<string>-c</string>
<string>
$HOME/.osx-env-sync.sh
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
-l
parametr ma tutaj kluczowe znaczenie; jest to konieczne do wykonania skryptu powłoki za pomocą powłoki logowania, dlatego ~/.bash_profile
jest on pozyskiwany w pierwszej kolejności przed wykonaniem skryptu.
Teraz skrypt powłoki. Utwórz go w ~/.osx-env-sync.sh
następującej treści:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv ${envvar} ${!envvar}
done
Upewnij się, że skrypt powłoki jest wykonywalny:
chmod +x ~/.osx-env-sync.sh
Teraz załaduj agenta uruchamiania dla bieżącej sesji:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
(Re) Uruchom aplikację GUI i sprawdź, czy może odczytać zmienne środowiskowe.
Konfiguracja jest trwała. Przetrwa restarty i ponowne logowania.
Jeśli po początkowej konfiguracji (którą właśnie zrobiłeś), jeśli chcesz ponownie odzwierciedlić zmiany w ~/.bash_profile
całym swoim środowisku, ponowne uruchomienie launchctl load ...
polecenia nie wykona tego, co chcesz; zamiast tego pojawi się ostrzeżenie:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Aby ponownie załadować zmienne środowiskowe bez przechodzenia przez proces wylogowania / logowania, wykonaj następujące czynności:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Na koniec należy ponownie uruchomić już uruchomione aplikacje (w tym Terminal.app), aby uświadomić im zmiany.
Przesłałem również kod i objaśnienia do projektu GitHub: osx-env-sync .
Mam nadzieję, że będzie to najlepsze rozwiązanie, przynajmniej dla najnowszych wersji OS X (Yosemite i El Capitan).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
uruchomić aplikację GUI z nowym ustawionym środowiskiem systemowym.