Ustawianie zmiennych środowiskowych w systemie OS X

849

Jaki jest właściwy sposób modyfikowania zmiennych środowiskowych takich jak PATH w OS X?

Spojrzałem trochę na Google i znalazłem trzy różne pliki do edycji:

  • / etc / paths
  • ~ / .profile
  • ~ / .tcshrc

Nie mam nawet niektórych z tych plików i jestem prawie pewien, że .tcshrc jest zły, ponieważ OS X używa teraz bash. Gdzie są zdefiniowane te zmienne, zwłaszcza PATH?

Używam OS X 10.5 (Leopard).

Paul Wicks
źródło
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/uruchomić aplikację GUI z nowym ustawionym środowiskiem systemowym.
Hong

Odpowiedzi:

652

Bruno jest na dobrej drodze. Przeprowadziłem szeroko zakrojone badania i jeśli chcesz ustawić zmienne, które są dostępne we wszystkich aplikacjach GUI, twoją jedyną opcją jest /etc/launchd.conf.

Pamiętaj, że environment.plist nie działa w przypadku aplikacji uruchomionych przez Spotlight. Dokumentuje to tutaj Steve Sexton .

  1. Otwórz monit terminalu

  2. Wpisz sudo vi /etc/launchd.conf(uwaga: ten plik może jeszcze nie istnieć)

  3. Umieść zawartość w pliku jak poniżej

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
    
  4. Zapisz zmiany w vi i uruchom ponownie komputer Mac. Lub użyj polecenia grep/ xargspokazanego w powyższym komentarzu do kodu.

  5. Udowodnij, że twoje zmienne działają, otwierając okno terminala i wpisując, exporta powinieneś zobaczyć swoje nowe zmienne. Będą one również dostępne w IntelliJ IDEA i innych aplikacjach GUI uruchamianych przez Spotlight.

Matthew McCullough
źródło
3
Mówię, że zaakceptowana odpowiedź (environment.plist) nie była dla mnie skuteczna. Z powodzeniem zastosowałem metodę launchd.conf na 10.5 i 10.6 na czterech komputerach.
Matthew McCullough,
54
Czy można to zrobić bez ponownego uruchamiania systemu ?
sorin
40
Powyższe ograniczenie dotyczy systemu MacOS X 10.5. Jednak MacOS X 10.6 nie ma już tego ograniczenia, a ustawianie wartości w środowisku environment.plist działa dobrze nawet w przypadku aplikacji uruchamianych za pomocą wyróżnienia. Tak więc wybrana odpowiedź jest poprawna dla Snow Leopard ;-)
Louis Jacomet
5
Ustawienie launchd.confjest jednokierunkowe, ale wymaga ponownego uruchomienia (w celu ponownego uruchomienia). Jeśli chcesz uniknąć ponownego uruchomienia, zobacz moją odpowiedź stackoverflow.com/questions/135688/...
Matt Curtis,
23
Istnieje kilka problemów z przedstawionym podejściem do uruchomienia. Większość jest specyficzna dla zmiennej środowiskowej PATH, ale pytający wspomniał konkretnie PATH. 1) elementy w pliku launchd.conf nie są stosowane w interaktywnych powłokach, takich jak ssh, do systemu. 2) posiadanie wiersza „setenv PATH / testdir” dołącza się do PATH w Terminal.app, ale usuwa wszystkie inne elementy PATH w środowiskach aplikacji OS X. 3) Wykonanie polecenia „setenv PATH $ {PATH}: / testdir” w pliku /etc/launchd.conf nie rozwija poprawnie istniejącej ścieżki PATH 4) launchd.conf dotyczy wszystkich użytkowników, a nie tylko jednego. Nie to, że mam lepsze rozwiązanie.
NoahR,
257

Jak ustawić środowisko dla nowych procesów uruchomionych przez Spotlight (bez konieczności ponownego uruchamiania)

Możesz ustawić środowisko używane przez uruchomione (i, co za tym idzie, wszystko, co rozpoczęło się od Spotlight) za pomocą launchctl setenv. Na przykład, aby ustawić ścieżkę:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Lub jeśli chcesz ustawić swoją ścieżkę w .bashrcpodobny sposób, to niech zostanie dublowana w uruchomionym:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Nie ma potrzeby ponownego uruchamiania, ale musisz ponownie uruchomić aplikację, jeśli chcesz, aby odebrała zmienione środowisko.

Obejmuje to wszelkie powłoki już uruchomione w Terminal.app, chociaż jeśli tam jesteś, możesz ustawić środowisko bardziej bezpośrednio, np. Za pomocą export PATH=/opt/local/bin:/opt/local/sbin:$PATHbash lub zsh.

Jak zachować zmiany po ponownym uruchomieniu

Aby zachować zmiany po ponownym uruchomieniu , możesz ustawić zmienne środowiskowe /etc/launchd.conf, na przykład:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf jest wykonywany automatycznie po ponownym uruchomieniu.

Jeśli chcesz, aby zmiany zaczęły obowiązywać, powinieneś użyć tego polecenia do ponownego przetworzenia launchctl.conf(dzięki @mklement za wskazówkę!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Możesz dowiedzieć się więcej o tym launchctli jak się ładuje launchd.confza pomocą polecenia man launchctl.

Matt Curtis
źródło
2
Bardzo fajny! Zaletą korzystania z environment.plist wydaje się jednak to, że OS X honoruje zawartość tych plików bez konieczności wcześniejszego uruchamiania terminala. W każdym razie myślę, że twoja odpowiedź koncentrowała się głównie na uniknięciu konieczności ponownego uruchomienia komputera, więc dziękuję za to.
fotNelton,
2
@kapuzineralex Tak, pozwala uniknąć ponownego uruchomienia, zmienia także środowisko programów uruchamianych z Spotlight, co environment.plistnie jest możliwe.
Matt Curtis,
2
Ustawienie środowiska w ten sposób działało dla mnie tylko do momentu ponownego uruchomienia. Zmienna środowiskowa nie przetrwała po ponownym uruchomieniu komputera Mac. Odpowiedź Matthew działała dla mnie idealnie.
Shamal Karunarathne,
8
@Shamal: Dałem +1 Twojemu komentarzowi, ale pamiętaj, że odpowiedź Matthew wymaga ponownego uruchomienia, podczas gdy ja wskazuję właściwy sposób, aby to zmienić bez ponownego uruchomienia. Jeśli chcesz obu, proponuję umieścić ustawienia ścieżki w pliku launchd.conf (tak, aby utrzymywały się one podczas restartów), a następnie użyć skryptu z czymś takim jak ten „source /etc/launchctl.conf; launchctl setenv PATH $ PATH”, więc możesz także „odświeżyć”, kiedy nie chcesz restartować.
Matt Curtis,
5
@MattCurtis Czy możesz edytować swoją odpowiedź bezpośrednio, aby wyjaśnić, że chociaż nie jest wymagane ponowne uruchomienie, zmiany zostaną utracone po ponownym uruchomieniu? Również poprawny sposób, aby zastosować zmiany etc/launchd.confprzed restart byłoby wykorzystanie podejścia w @ odpowiedź MatthewMcCullough za: egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl.
mklement0
106

Aż do OS X 10.7 (Lion) możesz je ustawić w:

~/.MacOSX/environment.plist

Widzieć:

W przypadku PATH w terminalu powinieneś być w stanie ustawić .bash_profilelub .profile(prawdopodobnie będziesz musiał go jednak utworzyć)

W systemie OS X 10.8 (Mountain Lion) i nowszych wersjach należy użyć launchdilaunchctl .

tim_yates
źródło
4
Dzieje się tak tylko wtedy, gdy faktycznie oczekujesz, że będą używane przez aplikacje graficzne. Ponieważ zwykle nie używają zmiennych środowiskowych, nie jest to zbyt dobre miejsce do ich ustawiania.
Chris Hanson,
18
Istnieje kilka bardzo dobrych przykładów aplikacji graficznych wykorzystujących zmienne środowiskowe. Na przykład IntelliJ lubi widzieć M2_HOME, aby wiedzieć, gdzie mieszka Maven. Aby zobaczyć zmienną, musisz ustawić ją w /etc/launchd.conf zamiast environment.plist.
Matthew McCullough
3
Dla porównania: używanie nie preferences.plistbyło idealne w systemie OS X 10.5, ponieważ w tamtym czasie preferences.plistnie było czytane dla aplikacji uruchomionych przez centrum uwagi, zobacz komentarz Louisa do odpowiedzi Matthew i email.esm.psu.edu/pipermail/macosx-emacs/2010-May /002113.html . W systemie OS X 10.6 environment.plistdziała tak, jak powinno.
Janus
16
Nie dotyczy to już OSX 10.8 apple.stackexchange.com/questions/57385/…
thatsmydoing
1
@tim_yates Czy możesz edytować pierwszy wiersz swojej odpowiedzi i przeczytać „Do lwa włącznie (10. * 7 *)”, biorąc pod uwagę, że to jest prawidłowe? Próbowałem dokonać tej edycji do oryginalnego, dwuznacznego „Up to Mountain Lion”, a recenzenci spartaczyli go.
mklement0
67

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_profilew 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 plistprzyrostkiem (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>

-lparametr ma tutaj kluczowe znaczenie; jest to konieczne do wykonania skryptu powłoki za pomocą powłoki logowania, dlatego ~/.bash_profilejest on pozyskiwany w pierwszej kolejności przed wykonaniem skryptu.

Teraz skrypt powłoki. Utwórz go w ~/.osx-env-sync.shnastę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_profilecał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).

Ersin Er
źródło
Działa ładnie. Nieco zmartwiony, jeśli stanie się popularny, jeśli będzie to luka bezpieczeństwa
Warren P
3
To rozwiązanie było jedynym, które udało mi się prawidłowo uruchomić. Świetne rozwiązania. Nie rozumiem, dlaczego na
Macu
2
Niestety nie działa to w przypadku El Capitan. Twój komentarz od github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508 dobrze wyjaśnia problem.
mgol
1
Więc to rozwiązanie nie działa, /etc/launchd.conf nie ma żadnego efektu, Node.js instaluje swój plik binarny do / usr / local / bin i ta ścieżka nie znajduje się w PATH dla aplikacji GUI. Dlatego haki Git korzystające z Node nie działają w aplikacjach GUI Git, takich jak SourceTree, w El Capitan. To jest okropne.
mgol
1
Problem dotyczy tylko zmiennej PATH. Mam nadzieję, że wkrótce znajdziemy rozwiązanie.
Ersin Er
54
  1. Zrobić:

    vim ~/.bash_profile

    Plik może nie istnieć (jeśli nie, możesz go po prostu utworzyć).

  2. Wpisz to i zapisz plik:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Biegać

    source ~/.bash_profile
WoooHaaaa
źródło
+1 exportjest tym, co chciałem zasugerować, ponieważ BASH nie obsługujesetenv
vol7ron
Na razie działa. Cała ta sprawa wygląda na znacznie bardziej skomplikowaną, niż myślałem. Później będę musiał poświęcić na to trochę więcej czasu. Dzięki.
Ruto Collins
34

Zasadniczo istnieją dwa problemy do rozwiązania w przypadku zmiennych środowiskowych w OS X. Pierwszy dotyczy wywoływania programów z Spotlight (ikona lupy po prawej stronie menu / paska stanu Mac), a drugi wywoływania programów z Docka . Wywoływanie funkcji z aplikacji Terminal / narzędzie jest trywialny, ponieważ czyta środowiska przed standardowych lokalizacjach Shell ( ~/.profile, ~/.bash_profile, ~/.bashrc, itd.)

Podczas wywoływania programów z Docku, użyj ~/.MacOSX/environment.plist tam , gdzie <dict>element zawiera sekwencję <key>KEY</key><string>theValue</string>elementów.

Podczas wywoływania programów z Spotlight, upewnij się, że uruchomione zostało skonfigurowane ze wszystkimi wymaganymi ustawieniami klucza / wartości.

Aby rozwiązać oba problemy jednocześnie, używam elementu logowania (ustawionego za pomocą narzędzia Preferencje systemowe) na moim koncie użytkownika. Element logowania to skrypt bash, który wywołuje funkcję wypaczania Emacsa, chociaż można oczywiście użyć swojego ulubionego narzędzia skryptowego, aby osiągnąć to samo. Takie podejście ma tę dodatkową zaletę, że działa w dowolnym momencie i nie wymaga ponownego uruchomienia, tzn. Można edytować ~/.profile, uruchamiać element logowania w jakiejś powłoce i wyświetlać zmiany dla nowo wywoływanych programów z Docka lub Spotlight.

Detale:

Element logowania: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Funkcja Emacs lisp: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

UWAGA: To rozwiązanie stanowi mieszankę tych, które pojawiły się przed dodaniem mojej, szczególnie tej oferowanej przez Matta Curtisa, ale celowo starałem się zachować ~/.bash_profileniezależność mojej platformy treści i umieścić launchdśrodowisko (tylko dla komputerów Mac) w osobnym skrypcie .

pajato0
źródło
19
Łał. Nie mówię, że to nie zadziała, ale ... Jestem po prostu przerażony złożonością wymaganą do uzyskania spójnego środowiska w OS X.
offby1
2
Działa to najlepiej spośród wszystkich rozwiązań, które widziałem dla 10.9. Jedyną wadą jest to, że ponieważ elementy logowania działają w nieokreślonej kolejności, jeśli Emacs (na przykład) zostanie uruchomiony przy logowaniu (ponieważ na przykład był otwarty podczas wylogowania), niekoniecznie będzie miał zmienne środowiskowe, dopóki go nie uruchomisz ponownie , ponieważ jest uruchamiany przed uruchomieniem skryptu.
telotortium
22

Kolejnym darmowym rozwiązaniem typu open source Mac OS X 10.8 (Mountain Lion) Panel preferencji / environment.plist jest EnvPane .

Kod źródłowy EnvPane dostępny na GitHub . EnvPane wygląda na to, że ma porównywalne funkcje do RCEnvironment , jednak wydaje się, że może natychmiast zaktualizować przechowywane zmienne, tj. Bez konieczności restartu lub logowania, co jest mile widziane.

Jak stwierdził deweloper:

EnvPane to panel preferencji dla systemu Mac OS X 10.8 (Mountain Lion), który pozwala ustawić zmienne środowiskowe dla wszystkich programów zarówno w sesjach graficznych, jak i terminalowych. Nie tylko przywraca obsługę ~ / .MacOSX / environment.plist w Mountain Lion, ale także natychmiast publikuje zmiany w środowisku, bez konieczności wylogowywania się i ponownego logowania. <SNIP> EnvPane zawiera (i automatycznie instaluje) uruchomiono agenta, który działa 1) wcześnie po zalogowaniu i 2) przy każdej zmianie ~ / .MacOSX / environment.plist. Agent odczytuje ~ / .MacOSX / environment.plist i eksportuje zmienne środowiskowe z tego pliku do uruchomionej instancji bieżącego użytkownika za pośrednictwem tego samego interfejsu API, który jest używany przez launchctl setenv i launchctl unsetenv.

Oświadczenie: Nie jestem w żaden sposób związany z deweloperem lub jego projektem.

PS Podoba mi się nazwa (brzmi jak „Ends Pain”).

Big Rich
źródło
2
EnvPane nie może obecnie ustawić PATH. Aby uzyskać więcej informacji, zobacz mój raport o błędzie: github.com/hschmidt/EnvPane/issues/5
Uwe Günther
Ja ♥ ️ to coś… Jedyną wadą… którą, jak sądzę, JAKIEKOLWIEK rozwiązanie będzie ofiarą … jest konieczność ponownego uruchomienia procesu - odziedziczenia nowego „środowiska”. Wonk wonk.
Alex Gray
2
@sorin: Czy możesz otworzyć problem na stronie GitHub z opisem napotkanego problemu? EnvPane działa dla mnie 10.10. Oświadczenie: Jestem autorem EnvPane.
Hannes
17

Aktualizacja (2017-08-04)

Począwszy od (przynajmniej) macOS 10.12.6 (Sierra) ta metoda wydaje się przestać działać dla Apache httpd (zarówno dla, jak systemi dla useropcji launchctl config). Wydaje się, że nie dotyczy to innych programów. Można sobie wyobrazić, że jest to błąd w httpd.

Oryginalna odpowiedź

Dotyczy to OS X 10.10+ (10.11+ szczególnie ze względu na tryb rootowania, w którym /usr/binnie można go już zapisać).

Czytałem w wielu miejscach, że użycie launchctl setenv PATH <new path>ustawienia PATHzmiennej nie działa z powodu błędu w OS X (co wydaje się prawdziwe z własnego doświadczenia). Odkryłem, że PATHmożna ustawić inny sposób dla aplikacji, które nie są uruchamiane z powłoki :

sudo launchctl config user path <new path>

Ta opcja jest udokumentowana na stronie manuala launchctl:

system konfiguracji | wartość parametru użytkownika

Ustawia trwałe informacje o konfiguracji dla domen launchd (8). Można skonfigurować tylko domenę systemową i domeny użytkownika. Lokalizacja trwałego magazynu jest szczegółem implementacji, a zmiany w tym magazynie powinny być wprowadzane tylko za pomocą tej komendy. Ponowne uruchomienie jest wymagane, aby zmiany wprowadzone za pomocą tej komendy zaczęły obowiązywać.

[...]

ścieżka

Ustawia zmienną środowiskową PATH dla wszystkich usług w domenie docelowej na wartość ciągu. Wartość ciągu powinna być zgodna z formatem przedstawionym dla zmiennej środowiskowej PATH w środowisku (7). Należy zauważyć, że jeśli usługa określa swoją ŚCIEŻKĘ, zmienna środowiskowa specyficzna dla usługi ma pierwszeństwo.

UWAGA: Tego narzędzia nie można użyć do ustawienia ogólnych zmiennych środowiskowych dla wszystkich usług w domenie. Jest celowo dostosowany do zmiennej środowiska PATH i ze względów bezpieczeństwa nic innego.

Potwierdziłem, że współpracuję z aplikacją GUI uruchomioną z Findera (który używa getenvdo pobrania PATH). Pamiętaj, że musisz to zrobić tylko raz, a zmiana będzie trwała po ponownym uruchomieniu komputera.

Max Leske
źródło
To też działa dla mnie. sudo launchctl procinfo <gui-pid>pokazuje nowo ustawione PATHśrodowisko. Ale sudo launchctl config user path <new path>tak naprawdę ustawione dla wszystkich użytkowników ... (potwierdzone przez dodanie nowego użytkownika i użycie konsoli Pythona w Sublime Text)
Bossliaw
1
Wydaje się, że nie ma to wpływu na zmienną środowiskową PATH dla aplikacji, które są ponownie otwierane podczas logowania (które były otwarte podczas zamykania).
Brecht Machiels
Ciekawy. Oznaczałoby to, że w przypadku aplikacji, które zostaną ponownie otwarte, środowisko (lub jego podzbiór) jest zapisywane.
Max Leske,
@MaxLeske Nie, ponownie otwarte aplikacje są uruchamiane przed zmianą zmiennej środowiskowej. Tak więc nie sudo launchctl config user pathdzieje się to po raz pierwszy (co wydaje się zakładać?).
Brecht Machiels
1
@ShlomiSchwartz launchctlsposób nie pozwalają na dowolne ustawienie zmiennych środowiskowych. PATHZmienna jest wyjątek.
Max Leske,
17

Na Mountain Lion wszystko /etc/pathsi /etc/launchd.confedycja nie przynosi żadnego efektu!

Fora programistów Apple mówią:

„Zmień Info.plist samej aplikacji., Aby zawierała słownik„ LSEnvironment ”ze zmiennymi środowiskowymi, które chcesz.

~ / .MacOSX / environment.plist nie jest już obsługiwany. ”

Więc bezpośrednio edytowałem aplikację Info.plist(kliknij prawym przyciskiem „AppName.app” (w tym przypadku SourceTree), a następnie „ Show package contents”).

Pokaż Zawartość opakowania

I dodałem nową parę klucz / dykt o nazwie:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(patrz: Dokumentacja LaunchServicesKeys w Apple )

Wpisz opis zdjęcia tutaj

Teraz aplikacja (w moim przypadku Sourcetree) używa podanej ścieżki i działa z Git 1.9.3 :-)

PS: Oczywiście musisz dostosować wpis Ścieżki do swoich specyficznych potrzeb.

Flori
źródło
3
To rozwiązanie spełnia minimalne wymagania dotyczące systemu. Dzięki.
John Vance
@ John Vance +1 Całkowicie się zgadzam, zmiany w całym systemie są zawsze ryzykowne, jak wyjaśnia Jason T. Miller w swojej odpowiedzi
rmcsharry
5
W El Capitan nie ma to dla mnie żadnego efektu. :(
mgol
W High Sierra 10.13, jeśli zmodyfikuję Info.plistplik aplikacji, aplikacja nie załaduje się:LSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
kunjbhai
16

Chociaż odpowiedzi tutaj nie są „złe”, dodam jeszcze jedno: nigdy nie wprowadzaj zmian zmiennych środowiskowych w OS X, które wpływają na „wszystkie procesy”, a nawet poza powłoką, dla wszystkich procesów uruchamianych interaktywnie przez danego użytkownika.

Z mojego doświadczenia wynika, że ​​globalne zmiany zmiennych środowiskowych, takich jak PATH, dla wszystkich procesów są bardziej narażone na uszkodzenie w OS X niż w Windows. Powodem jest to, że wiele aplikacji OS X i innego oprogramowania (w tym, być może szczególnie elementy samego systemu operacyjnego), opiera się na narzędziach wiersza poleceń UNIX pod maską i zakłada zachowanie wersji tych narzędzi dostarczanych wraz z systemem, oraz niekoniecznie używaj do tego bezwzględnych ścieżek (podobne komentarze dotyczą dynamicznie ładowanych bibliotek i zmiennych środowiskowych DYLD_ *). Weźmy na przykład pod uwagę, że najwyżej oceniane odpowiedzi na różne pytania dotyczące przepełnienia stosu dotyczące zastąpienia dostarczonych przez OS X wersji interpreterów, takich jak Python i Ruby, zazwyczaj mówią „nie rób tego”.

Pod tym względem OS X tak naprawdę nie różni się od innych systemów operacyjnych typu UNIX (np. Linux, FreeBSD i Solaris); najbardziej prawdopodobnym powodem, dla którego Apple nie zapewnia łatwego sposobu, jest to, że psuje rzeczy . W zakresie, w jakim system Windows nie jest tak podatny na te problemy, wynika to z dwóch rzeczy: (1) Oprogramowanie Windows zwykle nie korzysta z narzędzi wiersza poleceń w takim stopniu, jak oprogramowanie UNIX, oraz (2) Microsoft miał tak obszerna historia zarówno „piekła DLL”, jak i problemów związanych z bezpieczeństwem spowodowanych zmianami wpływającymi na wszystkie procesy, które zmieniły zachowanie dynamicznego ładowania w nowszych wersjach systemu Windows, aby ograniczyć wpływ „globalnych” opcji konfiguracji, takich jak PATH.

„Lame” lub nie, będziesz mieć znacznie bardziej stabilny system, jeśli ograniczysz takie zmiany do mniejszych zakresów.

Jason T. Miller
źródło
Mówienie ludziom, aby nie robili tego, o co pytali, nie jest odpowiedzią na zadane pytanie. Uniemożliwianie ludziom robienia tego również niszczy rzeczy. Sposób działania Apple.
frabjous
Ustawienie PATH w /Applications/App.app/Contents/Info.plist za pomocą klucza LSEnvironment developer.apple.com/library/archive/documentation/General/... może być obecnie zalecanym rozwiązaniem.
Dave X
15

Czasami wszystkie poprzednie odpowiedzi po prostu nie działają. Jeśli chcesz mieć dostęp do zmiennej systemowej (np. M2_HOME) W Eclipse lub IntelliJ IDEA, jedyną rzeczą, która działa dla mnie w tym przypadku, jest:

Najpierw (krok 1) edytuj, /etc/launchd.confaby zawierał taki wiersz: „wartość VAR setenv”, a następnie (krok 2) uruchom ponownie.

Po prostu modyfikacja .bash_profile nie będzie działać, ponieważ w OS X aplikacje nie są uruchamiane tak jak w innych systemach uniksowych; nie dziedziczą zmiennych powłoki rodzica. Wszystkie pozostałe modyfikacje nie będą działać z nieznanego mi powodu. Może ktoś inny może to wyjaśnić.

Bruno Ranschaert
źródło
5
Aplikacje uruchamiane z Spotlight lub w jakikolwiek inny sposób mają odczyt /etc/launchd.conf przez proces nadrzędny, dzięki czemu jest to atrakcyjny wybór, gdzie ustawić zmienne środowiskowe widoczne we wszystkich aplikacjach i powłokach.
Matthew McCullough
1
Zobacz moją odpowiedź na inne rozwiązanie, które pozwala uniknąć ponownego uruchomienia - stackoverflow.com/questions/135688/...
Matt Curtis
Mój komputer MaxOS 10.6 nie ma pliku /etc/launchd.conf. Czy jest to nowa czy przestarzała rzecz w tej wersji? A może ta maszyna jest popsuta?
peterk
13

Po przeszukaniu okienka preferencji Zmienne środowiskowe i odkryciu, że link jest zepsuty, a wyszukiwanie w witrynie Apple wydaje się wskazywać, że o nim zapomniały ... Zacząłem z powrotem na trop nieuchwytnego procesu uruchamiania.

W moim systemie (Mac OS X 10.6.8) wydaje się, że zmienne zdefiniowane w environment.plist niezawodnie eksportowane do aplikacji uruchamianych z Spotlight (poprzez uruchomienie). Mam problem z tym, że te zmienne nie są eksportowane do nowych sesji bash w Terminalu. Tzn. Mam odwrotny problem, jak tu przedstawiono.

UWAGA: environment.plist wygląda jak JSON, a nie XML, jak opisano wcześniej

Udało mi się uzyskać aplikacje Spotlight do zobaczenia zmiennych, edytując ~ / MacOSX / environment.plist i mogłem zmusić te same zmienne do nowej sesji terminala, dodając następujące elementy do mojego pliku .profile:

eval $(launchctl export)
Russell B
źródło
2
Nie tak nieuchwytny: RCenvironment
Gilimanjaro
Dobra wskazówka na temat eksportu launchctl. Ale nie umieściłbym tego w obecnej wersji w .profile. Zastąpi twoją $ PATH tą, która nie zawiera / usr / local / bin. Ale możesz użyć wyrażenia regularnego, aby wybrać zmienne, którymi jesteś zainteresowany: `` eval $ (launchctl export | grep '^ my. * =').
mivk
3
Na mojej nowej maszynie Mountain Lion (10.8.2) portal environment.plist jest całkowicie bezwartościowy. Zobacz odpowiedź Matthew na właściwy utwór. Chodzi o uruchomioną aplikację wiersza polecenia launchctl wraz z /etc/launchd.conf. Można przeczytać sobie z man launchd, man launchctli man launchd.confw oknie terminala. Cieszę się, że Apple aktualizuje strony podręcznika, nawet jeśli biblioteka programistów Mac jest nieco opóźniona.
Russell B,
10

Wszelkie plików bash starcie - ~/.bashrc, ~/.bash_profile, ~/.profile. Istnieje również jakiś dziwny plik nazwany ~/.MacOSX/environment.plistzmiennymi środowiskowymi w aplikacjach GUI.

John Millikin
źródło
10

Podobnie jak odpowiedź Matta Curtisa, ustawiam zmienne środowiskowe za pomocą launchctl, ale zawijam je w funkcję o nazwie export, dzięki czemu za każdym razem, gdy eksportuję zmienną w normalny sposób w moim pliku .bash_profile, jest ona również ustawiana przez launchctl. Oto co robię:

  1. Mój .bash_profile składa się wyłącznie z jednej linii (jest to tylko preferencja osobista).

    source .bashrc
  2. Mój .bashrc ma to:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. Powyższe spowoduje przeciążenie wbudowanego „eksportu” Bash i wyeksportuje wszystko normalnie (zauważysz, że eksportuję za jego pomocą „eksport”!), A następnie odpowiednio ustawię je dla środowisk aplikacji OS X poprzez launchctl, niezależnie od tego, czy korzystasz z któregokolwiek z poniższych:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. W ten sposób nie muszę wysyłać każdej zmiennej do launchctl za każdym razem i mogę po prostu skonfigurować mój .bash_profile / .bashrc tak, jak chcę. Otwórz okno terminala, sprawdź zmienne środowiskowe, które Cię interesują launchctl getenv myVar, zmień coś w .bash_profile / .bashrc, zamknij okno terminala i otwórz je ponownie, sprawdź zmienną ponownie za pomocą launchctl i voila, to się zmieniło.

  5. Ponownie, podobnie jak inne rozwiązania dla świata post-Mountain Lion, aby wszelkie nowe zmienne środowiskowe były dostępne dla aplikacji, musisz je uruchomić lub ponownie uruchomić po zmianie.

courtlandj
źródło
1
Przydatna odpowiedź - dzięki. Właśnie ją zaktualizowałem, ponieważ twoje oryginalne rozwiązanie nie obsługiwało przypadków, w których wartość zmiennej środowiskowej, którą ustawiłeś, miała w sobie znaki równości (np. CXX_FLAGS = "- mmacosx-wersja-min = 10,9"
Steve Broberg,
@ SteveBroberg - tylko jedna zmiana znaku naprawia wyrażenie regularne Bash bez potrzeby sed! (Nie zrozum mnie źle, uwielbiam sed, ale to działa i jest o wiele krótsze.)
courtlandj
1
Pomyślałem, że musi być lepszy sposób, ale nie jestem guru bash i nie mogłem znaleźć w Google, czym były %%, ## itp.
Steve Broberg
10

Oto bardzo prosty sposób na robienie tego, co chcesz. W moim przypadku Gradle zaczął działać (dla Androida Studio).

  • Otwórz terminal.
  • Uruchom następujące polecenie:

    sudo nano /etc/paths lub sudo vim /etc/paths

  • Po wyświetleniu monitu wprowadź hasło.

  • Przejdź na koniec pliku i wprowadź ścieżkę, którą chcesz dodać.
  • Naciśnij Control+, Xaby wyjść.
  • Wpisz „Y”, aby zapisać zmodyfikowany bufor.
  • Otwórz nowe okno terminala, a następnie wpisz:

    echo $PATH

Powinieneś zobaczyć nową ścieżkę dołączoną na końcu ŚCIEŻKI.

Otrzymałem te szczegóły z tego postu:

Dodaj do ŚCIEŻKI w systemie Mac OS X 10.8 Mountain Lion i nowszych

przewodowy00
źródło
7

Aby być zwięzłym i jasnym na temat tego, do czego przeznaczony jest każdy plik

  • ~/.profile jest pozyskiwany przy każdym uruchomieniu Terminal.app
  • ~/.bashrc jest tam, gdzie „tradycyjnie” ustawione są wszystkie instrukcje eksportu dla środowiska Bash
  • /etc/paths to główny plik w systemie Mac OS, który zawiera listę domyślnych ścieżek do budowania zmiennej środowiskowej PATH dla wszystkich użytkowników
  • /etc/paths.d/ zawiera pliki, które zawierają dodatkowe ścieżki wyszukiwania

Programy nieterminalne nie dziedziczą ogólnosystemowych zmiennych PATH i MANPATH, które robi twój terminal! Aby ustawić środowisko dla wszystkich procesów uruchomionych przez konkretnego użytkownika, a tym samym udostępnić zmienne środowiskowe aplikacjom graficznym Mac OS X, zmienne te należy zdefiniować w ~/.MacOSX/environment.plist(Pytania techniczne Apple QA1067)

Użyj następującego polecenia, aby zsynchronizować environment.plistz /etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"
Claudio Floreani
źródło
6

/etc/launchd.conf nie jest używany w systemie OS X 10.10 (Yosemite), OS X 10.11 (El Capitan), macOS 10.12 (Sierra) ani macOS 10.13 (High Sierra).


Ze strony podręcznika launchctl:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

Metoda opisana w tym pytaniu Odpowiedź działa dla mnie (po ponownym uruchomieniu): aplikacje uruchomione z Docka lub ze Spotlight dziedziczą zmienne środowiskowe, które ustawiłem ~/Library/LaunchAgents/my.startup.plist. (W moim przypadku potrzebne do zestawu LANG, aby en_US.UTF-8za pomocą wtyczki Sublime Text).

David
źródło
Czy przy ponownym uruchomieniu jest kolejność ładowania, która zapewnia, że ​​moja.startup.plist zostałaby załadowana przed ponownym uruchomieniem aplikacji z ostatniej sesji?
kunjbhai
3

To proste:

Edytuj ~ / .profile i umieść zmienne w następujący sposób

$ vim ~ / .profile

W pliku umieść:

MY_ENV_VAR = wartość

  1. Zapisz (: wq)

  2. Uruchom ponownie terminal (wyjdź i otwórz go ponownie)

  3. Upewnij się, że wszystko jest w porządku:

$ echo $ MY_ENV_VAR

wartość $


Fernando Martínez
źródło
3

W przypadku modyfikacji dla jednego użytkownika użyj ~/.profiletych wymienionych. Poniższy link wyjaśnia, kiedy Bash odczytuje różne pliki.

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

Jeśli chcesz ustawić zmienną środowiskową dla aplikacji GUI, potrzebujesz pliku ~ / .MacOSX / environment.plist

mmaibaum
źródło
3

Nie jestem pewien co do plików /etc/pathsi ~/.MacOSX/environment.plist. To są nowe.

Ale dzięki Bash powinieneś wiedzieć, że .bashrcjest wykonywany przy każdym nowym wywołaniu powłoki i .bash_profilejest wykonywany tylko raz przy starcie.

Nie wiem, jak często to się dzieje w systemie Mac OS X. Myślę, że rozróżnienie to załamało się, gdy system okien uruchomił wszystko.

Osobiście eliminuję zamieszanie, tworząc .bashrcplik ze wszystkim, czego potrzebuję, a następnie:

ln -s .bashrc .bash_profile
mike511
źródło
3

Oprócz sugerowanych podejść należy zauważyć, że przynajmniej w OS X 10.5 (Leopard) ustawione zmienne launchd.confzostaną scalone z ustawionymi w nim ustawieniami .profile. Przypuszczam, że prawdopodobnie dotyczy to również ustawień ~/.MacOSX/environment.plist, ale nie zweryfikowałem.

MiB
źródło
3

Skonfiguruj zmienną środowiskową PATH w systemie Mac OS

Otwórz program Terminal (domyślnie znajduje się w folderze Aplikacje / Narzędzia). Uruchom następujące polecenie

touch ~/.bash_profile; open ~/.bash_profile

Spowoduje to otwarcie pliku w domyślnym edytorze tekstu.

Dla Androida SDK jako przykład:

Musisz dodać ścieżkę do katalogu narzędzi i narzędzi platformy Android SDK. W moim przykładzie użyję „/ Development / android-sdk-macosx” jako katalogu, w którym jest zainstalowany zestaw SDK. Dodaj następujący wiersz:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

Zapisz plik i zamknij edytor tekstu. Uruchom plik .bash_profile, aby zaktualizować ŚCIEŻKĘ:

source ~/.bash_profile

Teraz za każdym razem, gdy otworzysz program Terminal, PATH będzie zawierać zestaw Android SDK.

Charaf JRA
źródło
3

Po prostu zrobiłem to naprawdę łatwo i szybko. Najpierw utwórz plik ~ / .bash_profile z terminala:

touch .bash_profile

następnie

open -a TextEdit.app .bash_profile

Dodaj

export TOMCAT_HOME=/Library/Tomcat/Home

zachowajcie dokumentację i gotowe.

CodeOverRide
źródło
Perfecto Postępowałem zgodnie z instrukcjami dla JAVA_HOME, właśnie dodałem eksport JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Contents / Home i prawdziwy szybki sukces!
NarendraC,
Świetnie @NarendraC!
CodeOverRide
2

To całkiem proste. Edytuj plik .profile(vi, nano , Sublime Text lub inny edytor tekstu). Możesz go znaleźć w ~/katalogu (katalog użytkownika) i ustawić w ten sposób:

export MY_VAR=[your value here]

Przykład z domu Java:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

Zapisz go i wróć do terminala.

Możesz go ponownie załadować za pomocą:

source .profile

Lub zamknij i otwórz okno terminala.

francois.robert
źródło
2

W grze występują dwa rodzaje pocisków.

  • Niezalogowany: .bashrc jest ładowany ponownie za każdym razem, gdy zaczynasz nową kopię Bash
  • Login: .profile jest ładowany tylko wtedy, gdy logujesz się lub wyraźnie nakazujesz Bashowi załadowanie go i użycie go jako powłoki logowania.

Ważne jest, aby zrozumieć, że tutaj z Bash, plik .bashrcjest tylko do odczytu przez powłokę, która jest zarówno interaktywne i bez logowania, a znajdziecie, że ludzie często ładować .bashrcw .bash_profilecelu pokonania tego ograniczenia.

Teraz, gdy masz podstawową wiedzę, przejdźmy do tego, jak radziłbym ci ją skonfigurować.

  • .profile: utwórz go nieistniejący. Umieść tam swoją konfigurację PATH.
  • .bashrc: utwórz, jeśli nie istnieje. Umieść tam wszystkie swoje aliasy i niestandardowe metody.
  • .bash_profile: utwórz, jeśli nie istnieje. Umieść tam następujące elementy.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#
ZOXIS
źródło
2

Powłoki logowania

/etc/profile

Powłoka najpierw wykonuje polecenia w pliku /etc/profile. Użytkownik pracujący z uprawnieniami administratora może skonfigurować ten plik w celu ustalenia domyślnych cech systemowych dla użytkowników korzystających z Bash.

.bash_profile
.bash_login
.profile

Następny wygląda Shell ~/.bash_profile, ~/.bash_loginoraz ~/.profile(~ / jest krótko- dłoń do swojego katalogu domowego), w tej kolejności, wykonując polecenia w pierwszym z tych plików, które znajdzie. Możesz wstawić polecenia do jednego z tych plików, aby zastąpić ustawienia domyślne ustawione w /etc/profile. Powłoka działająca na wirtualnym terminalu nie wykonuje poleceń w tych plikach.

.bash_logout

Po wylogowaniu bash wykonuje polecenia z ~/.bash_logoutpliku. Ten plik często zawiera polecenia, które czyszczą po sesji, takie jak te, które usuwają pliki tymczasowe.

Interaktywne powłoki nielogowania

/etc/bashrc

Wiele ~/.bashrcplików nie wywołuje bezpośrednio bash /etc/bashrc. Ta konfiguracja umożliwia użytkownikowi pracującemu z uprawnieniami roota ustalenie domyślnych ogólnosystemowych cech dla nielogowanych powłok bash.

.bashrc

Interaktywna powłoka niezalogowana wykonuje polecenia w ~/.bashrcpliku. Zazwyczaj plik startowy dla powłoki logowania, takiej jak .bash_profile, uruchamia ten plik, więc zarówno powłoki logowania, jak i inne niż loginy uruchamiają polecenia .bashrc.

Ponieważ polecenia .bashrcmogą być wykonywane wiele razy, a podpowłoki dziedziczą wyeksportowane zmienne, dobrym pomysłem jest umieszczenie poleceń, które dodają do istniejących zmiennych w .bash_profilepliku.

Koray Tugay
źródło
2

Cała magia w iOS idzie tylko z użyciem sourcepliku, w którym eksportujesz zmienne środowiskowe.

Na przykład:

Możesz utworzyć taki plik:

export bim=fooo
export bom=bar

Zapisz ten plik jako bimbom.envi zrób source ./bimbom.ev. Voilá, masz zmienne środowiskowe.

Sprawdź je za pomocą:

echo $bim
suther
źródło
1

W przypadku Bash spróbuj dodać zmienne środowiskowe do pliku, /etc/profileaby były dostępne dla wszystkich użytkowników. Nie trzeba ponownie uruchamiać komputera, wystarczy rozpocząć nową sesję terminala.

Rabi
źródło