Istnieje kilka miejsc, w których można ustawić zmienne środowiskowe.
~/.profile
: użyj tego dla zmiennych, które chcesz ustawić we wszystkich programach uruchamianych z terminala (zauważ, że w przeciwieństwie do Linuksa wszystkie powłoki otwarte w Terminal.app są powłokami logowania).
~/.bashrc
: jest to wywoływane dla powłok, które nie są powłokami logowania. Użyj tego dla aliasów i innych rzeczy, które muszą zostać ponownie zdefiniowane w podpowłokach, a nie dla dziedziczonych zmiennych środowiskowych.
/etc/profile
: jest ładowany przed ~ / .profile, ale poza tym jest równoważny. Użyj go, jeśli chcesz, aby zmienna miała zastosowanie do programów terminalowych uruchomionych przez wszystkich użytkowników komputera (przy założeniu, że używają bash).
~/.MacOSX/environment.plist
: jest to czytane przez loginwindow przy logowaniu. Dotyczy to wszystkich aplikacji, w tym GUI, z wyjątkiem tych uruchomionych przez Spotlight w wersji 10.5 (nie 10.6). Wymaga to wylogowania i ponownego zalogowania, aby zmiany odniosły skutek. Ten plik nie jest już obsługiwany od wersji OS X 10.8.
launchd
instancja użytkownika : dotyczy to wszystkich programów uruchomionych przez użytkownika, GUI i CLI. Możesz zastosować zmiany w dowolnym momencie, używając setenv
polecenia w launchctl
. Teoretycznie powinieneś być w stanie wstawiać setenv
polecenia ~/.launchd.conf
i launchd
czytać je automatycznie po zalogowaniu się użytkownika, ale w praktyce nigdy nie zaimplementowano obsługi tego pliku. Zamiast tego możesz użyć innego mechanizmu do wykonania skryptu przy logowaniu i uzyskać to wywołanie skryptu, launchctl
aby skonfigurować launchd
środowisko.
/etc/launchd.conf
: jest to odczytywane przez uruchomienie podczas uruchamiania systemu i zalogowanie się użytkownika. Wpływają one na każdy pojedynczy proces w systemie, ponieważ uruchamiany jest procesem głównym. Aby zastosować zmiany do uruchomionego uruchomionego katalogu głównego, możesz wprowadzić do niego polecenia sudo launchctl
.
Podstawowe rzeczy do zrozumienia to:
- zmienne środowiskowe są dziedziczone przez dzieci procesu w momencie ich rozwidlenia.
- proces root to instancja uruchomiona, a dla każdej sesji użytkownika istnieje również osobna instancja uruchomiona.
- launchd umożliwia zmianę bieżących zmiennych środowiskowych za pomocą
launchctl
; zaktualizowane zmienne są następnie dziedziczone przez wszystkie nowe procesy, które odtąd forks.
Przykład ustawienia zmiennej środowiskowej za pomocą uruchomionego:
echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl
Teraz uruchom aplikację GUI, która korzysta ze zmiennej, i voila!
Aby obejść fakt, że ~/.launchd.conf
nie działa, możesz umieścić następujący skrypt ~/Library/LaunchAgents/local.launchd.conf.plist
:
<?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>local.launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl < ~/.launchd.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Następnie możesz umieścić w setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE
środku ~/.launchd.conf
, a będzie on wykonywany przy każdym logowaniu.
Zauważ, że podczas pipetowania listy poleceń do launchctl w ten sposób nie będziesz mógł ustawić zmiennych środowiskowych o wartościach zawierających spacje. Jeśli musisz to zrobić, możesz zadzwonić launchctl następująco: launchctl setenv MYVARIABLE "QUOTE THE STRING"
.
Należy również pamiętać, że inne programy uruchamiane przy logowaniu mogą być uruchamiane przed uruchomieniem, a zatem mogą nie widzieć ustawionych zmiennych środowiskowych.