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.


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).


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.


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


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.


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.


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.


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 .


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.