Zmienne środowiskowe w Mac OS X

186

Aktualizacja: poniższy link nie ma pełnej odpowiedzi . Konieczność ustawienia ścieżki lub zmiennej w dwóch miejscach (jednym dla GUI i drugim dla powłoki) jest kiepska.

Nie jest duplikatem : Ustawianie zmiennych środowiskowych w OS X?


Pochodząc z tła systemu Windows, w którym bardzo łatwo jest ustawiać i modyfikować zmienne środowiskowe (wystarczy przejść do Właściwości systemu> Zaawansowane> Zmienne środowiskowe), nie wydaje się to takie proste w Mac OS 10.5. Większość referencji mówi, że powinienem zaktualizować / etc / profile lub ~ / .profile. Czy są to odpowiedniki Zmiennych systemowych i Zmiennych użytkownika? Na przykład, gdzie powinienem ustawić moją JAVA_HOMEzmienną?


EDYTOWAĆ:

Chcę mieć dostęp do zmiennej z terminala, a także aplikacji takiej jak Eclipse. Mam również nadzieję, że nie muszę restartować / wylogowywać się, aby to zadziałało.

Abdullah Jibaly
źródło
I jest kilka rad w odpowiedziach na pytanie, które nie zostało tutaj powtórzone ...
dmckee --- były moderator kotek

Odpowiedzi:

142

Nie ma potrzeby kopiowania. Możesz ustawić zmienne środowiskowe używane przez uruchomione (i procesy potomne, tj. Wszystko, co zaczynasz od Spotlight)launchctl setenv .

Na przykład, jeśli chcesz utworzyć kopię lustrzaną swojej bieżącej ścieżki w uruchomionej po jej skonfigurowaniu w .bashrcdowolnym miejscu:

PATH=whatever:you:want
launchctl setenv PATH $PATH

Zmienne środowiskowe nie są automatycznie aktualizowane w uruchomionych aplikacjach. Będziesz musiał ponownie uruchomić aplikacje, aby uzyskać zaktualizowane zmienne środowiskowe (chociaż możesz po prostu ustawić zmienne w swojej powłoce, np. Nie ma potrzeby ponownego uruchamiania PATH=whatever:you:wantterminala).

Matt Curtis
źródło
1
Wygląda jak najlepsza jak dotąd odpowiedź, nie potrzeba aplikacji innej firmy!
Abdullah Jibaly,
2
Nie wydaje się to być globalne: zmienne środowiskowe ustawione w ten sposób są lokalne dla użytkownika. Nadal nie mamy globalnego mechanizmu ustawiania zmiennej środowiskowej.
Andrew
@Andrew Co masz na myśli, lokalne dla użytkownika? Spodziewałbym się, że wpłynie to na wszystkie procesy rozpoczęte później od uruchomienia.
Matt Curtis
@MattCurtis: Zmienne środowiskowe ustawione za pomocą launchctl setenvwydają się być widoczne tylko dla użytkownika dokonującego zmiany. Jeśli ustawię zmienną jako zwykły użytkownik, nie będzie widoczna do rootowania (przez sudo) i odwrotnie.
Andrew
2
@Andrew OK, root ma własne uruchomienie - ps aux | grep launchdpokaże to. Sprawdź także man sudo, które dokumenty, które sudo(domyślnie) celowo resetują środowisko - jeśli sudo -Eje zachowasz (w tym zmienne, które ustawiłeś launchctl setenv). Nawiasem mówiąc, czy macie na to rzeczywisty wniosek? Jeśli tak, to czy ta metoda działa dla Ciebie?
Matt Curtis,
299

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.
  • launchdinstancja użytkownika : dotyczy to wszystkich programów uruchomionych przez użytkownika, GUI i CLI. Możesz zastosować zmiany w dowolnym momencie, używając setenvpolecenia w launchctl. Teoretycznie powinieneś być w stanie wstawiać setenvpolecenia ~/.launchd.confi launchdczytać 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, launchctlaby 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.confnie 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 &lt; ~/.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.

Gumilaka
źródło
3
Właściwie, jeśli chodzi o ~/.MacOSX/environment.plist, na moim Lwie jest on czytany i używany. Właśnie to przetestowałem. Właściwie wolę to niż .launchd.conf, ponieważ używam panelu preferencji RCenvironment, aby go utrzymać.
Gilimanjaro,
5
Nie można przejść ~/.launchd.confdo wersji 10.6.8 - wydaje się, że nie ma żadnego efektu. Również strona man mówi, że ten plik nie jest obecnie obsługiwany.
snowcrash09
4
~ / .launchd.conf też nie działa na 10.7.3, a kiedy patrzę na stronę podręcznika, mówi $ HOME / .launchd.conf Twój uruchomiony plik konfiguracyjny (obecnie nieobsługiwany)
kreatywny
4
W wersji 10.8 (Mountain Lion) ~ / .MacOSX / environment.plist nie jest już obsługiwany. Według Apple Dev należy „Zmienić Info.plist samej aplikacji. Tak, aby zawierała słownik„ LSEnvironment ”z żądanymi zmiennymi środowiskowymi”. Aby uzyskać więcej informacji, zobacz apple.stackexchange.com/questions/57385/...
pnkfelix,
3
@LaC Świetny, kompleksowy post; czy możesz go zaktualizować, aby zauważyć, że ~/.launchd.confnadal nie jest obsługiwany i nie działa w systemie OS X 10.8.3? Zobaczman launchd.conf
mklement0
12

Myślę, że OP szuka prostego rozwiązania podobnego do systemu Windows.

proszę bardzo:

https://www.macupdate.com/app/mac/14617/rcenvironment

Tom Teman
źródło
1
Wow, to wygląda świetnie. jeszcze tego nie próbowałem, ale wygląda dokładnie tak, jak potrzebowałem z opisu.
Abdullah Jibaly,
6
btw, oryginalny link wydaje się być uszkodzony, odkąd go opublikowałem (co się dzieje, Apple? 301 są drogie?). Zamiast tego możesz użyć tego linku: macupdate.com/app/mac/14617/rcenvironment
Tom Teman
To jest naprawdę stare. Sprawdź drugą odpowiedź, w której wspomniano o osx-env-sync, aby uzyskać nowoczesne rozwiązanie, które działa nawet w systemie OS X 10.10 (Yosemite) i nowszych.
Warren P
1
Proszę streścić informacje z linku w swojej odpowiedzi. Jak już widzieliśmy, linki łamią się z różnych powodów.
użytkownik3.1415927
7

Możesz przeczytać o systemie Linux, który jest bardzo podobny do Mac OS X. Lub możesz przeczytać na BSD Unix, który jest nieco bliżej. W większości różnice między Linuksem a BSD nie są tak duże.

/etc/profile są zmiennymi środowiskowymi systemu.

~/.profile są specyficznymi dla użytkownika zmiennymi środowiskowymi.

„gdzie mam ustawić moją zmienną JAVA_HOME?”

  • Czy masz wielu użytkowników? Czy ich to obchodzi? Czy zepsułbyś innego użytkownika, zmieniając /etc/profile?

Generalnie wolę nie zadzierać z ustawieniami systemowymi, mimo że jestem jedynym użytkownikiem. Wolę edytować moje ustawienia lokalne.

S.Lott
źródło
5

W przypadku aplikacji GUI musisz tworzyć i edytować ~/.MacOSX/environment.plist. Więcej informacji tutaj . Musisz się wylogować, aby zaczęły obowiązywać. Nie jestem pewien, czy wpływają one również na aplikacje uruchamiane z Terminala, ale zakładam, że tak.

W przypadku aplikacji uruchomionych z terminalu możesz także edytować plik ~ / .profile.

JW.
źródło
2
Tak, Terminal odziedziczy zmienne, podobnie jak wszystko uruchomione z Terminalu. Aby zachować zmienne, możesz użyć panelu preferencji RC Środowisko .
Gilimanjaro,
1
To rozwiązanie nie działa już w niektórych wersjach systemu Mac OS X 10.7. Nie dotyczy żadnej wersji systemu Mac OS X 10.8 lub nowszej wersji. Zamiast tego patrz: stackoverflow.com/a/4567308/543738
LS
3

Wystarczy otworzyć ~/.profileplik za pomocą nanow Terminalu i wpisać tam:

export PATH=whatever/you/want:$PATH

Zapisz ten plik (cmd + X i Y). Następnie wyloguj się / zaloguj ponownie lub po prostu otwórz nową kartę w Terminalu i spróbuj użyć nowej zmiennej.

PROSZĘ NIE zapomnij dodać „: $ PATH” po czymkolwiek / you / want, w przeciwnym razie usuniesz wszystkie ścieżki w zmiennej PATH, które były tam wcześniej.

Migele
źródło
4
Dotyczy to tylko środowiska poleceń bash. Ustawione tutaj zmienne nie są widziane przez aplikacje GUI.
Warren P
3

Synchronizuj zmienne środowiskowe OS X dla aplikacji wiersza poleceń i GUI z jednego źródła za pomocą osx-env-sync .

Tutaj także zamieściłem odpowiedź na powiązane pytanie .

Ersin Er
źródło
To jest fantastyczne. Sugestia: Umieść skrypt startctl unload / launctl load „odśwież teraz” w skrypcie. Nazwałem to osx-env-sync-now.sh. Modyfikuję mój .bash_profile i uruchamiam mały skrypt „odśwież teraz” i kontynuuję. Wydaje mi się, że ma to wpływ na bezpieczeństwo, więc uważam, że należy wprowadzić pewne ograniczenia. Muszą być powody, dla których wyłączyli tę funkcję w OS X.
Warren P
@WarrenP Gotowe! Sprawdź repozytorium.
Ersin Er,
Doskonały. To rozwiązało dla mnie wiele bólu. Jeden przypadek, w którym jest to naprawdę przydatne, jest dla każdego, kto rozwija się w SCALA. Ustawienie SCALA_HOME zarówno dla scala wiersza poleceń, jak i scala GUI (np. W netbeans) jest w innym przypadku prawdziwym bólem.
Warren P
0

Jeśli chcesz zmienić zmienne środowiskowe na stałe w systemie macOS, ustaw je /etc/paths. Uwaga : ten plik jest domyślnie tylko do odczytu, więc będziesz musiał chmod, aby uzyskać uprawnienia do zapisu.

Igor Ganapolski
źródło
To mi nie działa. Mam /usr/bin/localw tym pliku, nawet bez modyfikacji pliku, tak było domyślnie, a jednak moje aplikacje GUI widzą tylko /usr/bin:/bin:/usr/sbin:/sbin. Ponownie uruchomiłem wiele razy.
mgol
@m_gol Co dostajesz, gdy biegniesz cat /etc/paths/?
IgorGanapolsky
1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, w osobnych wierszach. A jednak SourceTree widzi je wszystkie oprócz pierwszego.
mgol
Możesz zmienić na „Jeśli chcesz zmienić domyślną ścieżkę w macOS”. Nie ma to nic wspólnego z bardziej ogólnym problemem zmiennych środowiskowych.
rfay
0

Dla 2020 użytkowników Mac OS X Catalina:

Zapomnij o innych bezużytecznych odpowiedziach, tutaj potrzebne są tylko dwa kroki:

  1. Utwórz plik z konwencją nazewnictwa: priorytet-nazwa_aplikacji. Następnie skopiuj i wklej ścieżkę, którą chcesz dodaćPATH .

    Np. 80-vscodeZ zawartością /Applications/Visual Studio Code.app/Contents/Resources/app/bin/w moim przypadku.

  2. Przenieś ten plik do /etc/paths.d/. Nie zapomnij otworzyć nowej karty (nowej sesji) w Terminalu i wpisz, echo $PATHaby sprawdzić, czy ścieżka została dodana!

Uwaga: ta metoda dodaje tylko twoją ścieżkę do PATH.

Pada deszcz
źródło