Gdzie zadeklarować zmienne środowiskowe?

59

Jakie są właściwe miejsca dla:

  1. Globalne zmienne środowiskowe przeznaczone dla wszystkich użytkowników?
  2. Zmienne środowiskowe specyficzne dla użytkownika?
Ivan
źródło

Odpowiedzi:

16

Myślę, że strona wiki społeczności na temat zmiennych środowiskowych pomoże ci uporządkować

sagarchalizować
źródło
2
Problem polega na tym, że połączony dokument jest mylony i / lub po prostu niepoprawny w części zmiennych określonych przez użytkownika. Nadal próbuję znaleźć sposób, by to zrobić niezależnie od powłoki. $ HOME / .profile jest prawdopodobnie najlepszym
wyborem
16
Wklej tekst lub zrób migawkę połączonej zawartości - może nie być dostępna w przyszłości!
Nam G VU
4
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Thomas Ward
75

Aby dodać do odpowiedzi sagarchalise, mogę podsumować to, co sugeruje link, jako odpowiednie miejsce dla ustawień.

W przypadku ustawień globalnych zmienne środowiskowe dla całego systemu

  • Posługiwać się /etc/environment
  • Nie używaj /etc/profilelub/etc/bash.bashrc

Ze strony:

/etc/environment[...] jest przeznaczony w szczególności do systemowych ustawień zmiennych środowiskowych. To nie jest plik skryptu, ale raczej składa się z wyrażeń przypisania, po jednym w wierszu. W szczególności ten plik przechowuje ustawienia regionalne i ustawienia ścieżki w całym systemie.

Korzystanie /etc/profilejest bardzo uniksowym sposobem, ale jego funkcjonalność jest znacznie zmniejszona w Ubuntu. Istnieje tylko po to, aby wskazywać /etc/bash.bashrci zbierać wpisy /etc/profile.d.

W moim systemie jedynym interesującym wpisem w profilu.d jest /etc/profile.d/bash_completion.sh.

Dla ustawień lokalnych lub dla poszczególnych użytkowników

Zalecana była poprzednia wersja strony Ubuntu ~/.pam_environment, ale obecnie strona sugeruje, że jeśli to nie zadziała, powinieneś użyć

  • ~/.profile - Jest to prawdopodobnie najlepszy plik do umieszczania przypisań zmiennych środowiskowych, ponieważ jest on wykonywany automatycznie przez DisplayManager podczas sesji pulpitu procesu uruchamiania, a także przez powłokę logowania, gdy loguje się z konsoli tekstowej.

  • ~/.bash_profilelub ~./bash_login- Jeśli jeden z nich istnieje, bash wykonuje go zamiast ~/.profilekiedy bash jest uruchamiany jako powłoka logowania. Bash wolą ~/.bash_profilesię ~/.bash_login. [...] Te pliki domyślnie nie będą miały wpływu na sesję graficzną. ”

  • ~/.bashrc - „... może być najłatwiejszym miejscem do ustawiania zmiennych”.
Belacqua
źródło
1
Które programy czytają /etc/environmenti kiedy? Wydaje się, że nie działa z cronem, nawet gdy używaszSHELL=/bin/bash
SystemParadox
1
Wygląda na to, że / etc / environment jest częścią PAM, co oznacza, że ​​powinien ustawić domyślne środowisko dla wszystkich procesów. cron jest wyjątkowy (to znaczy zepsuty), szczególnie nadpisując to środowisko własnym.
SystemParadox
więc jak działa .bashrc? po bash_profile? zamiast .profile?
otwiera się
1
@opensas Prawdopodobnie powinieneś zadać osobne pytanie, odnosząc się do tego lub odpowiedzi.
belacqua
@belacqua powiedzmy, że muszę dodać 2 lub więcej zmiennych środowiskowych, aby /etc/environmentpolubić JAVA_HOME="/opt/java" i ANT_HOME="/opt/ant" jak to zrobić
Kasun Siyambalapitiya
7

Masz:

/ etc / profile: ogólnosystemowy plik .profile dla powłoki Bourne'a (sh (1)) i powłok kompatybilnych z Bourne (bash (1), ksh (1), ash (1), ...).

które działają w Lucid i Maverick

/etc/profile.d/*.sh

jeśli jest obecny i jeśli powłoka użytkownika jest bash:

/etc/bash.bashrc

W środowisku użytkownika istnieje myląca tablica specyficzna dla powłoki i tego, czy jest ona uważana za „powłokę logowania”. Jeśli powłoka jest bash:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

dla sh / dash:

$HOME/.profile

dla Zsh nawet nie spróbuję tego zrozumieć .

msw
źródło
5

Zgodnie z zaleceniami na https://help.ubuntu.com/community/EnvironmentVariables :

  1. Globalne zmienne środowiskowe, które mają wpływać na wszystkich użytkowników, powinny wejść /etc/environment.

  2. Należy ustawić zmienne środowiskowe specyficzne dla użytkownika ~/.pam_environment.

Unikaj plików profilu i rc, aby ustawić zmienne środowiskowe w Ubuntu. Sprawili mi więcej bólów głowy, niż są tego warte.

Łatwiej to jednak powiedzieć niż zrobić;)

Możliwe, że napotkasz tę samą lukę konfiguracyjną, która istniała dla mnie. Zobacz obejście dla zaszyfrowanego domu poniżej.

Mój ~/.pam_environment:

PATH            DEFAULT=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${HOME}/bin
IDEA_JDK        DEFAULT=${HOME}/Applications/jdk

Dlaczego brzydka ścieżka statyczna? ${PATH}nie zadziałałoby dla mnie. Zablokowałem swój login kilka razy, próbując go obejść, więc trzymam się brzydkiej statycznej kopii ustawień domyślnych :)

Obejście dla zaszyfrowanych folderów domowych

W wersjach Ubuntu do wersji Precise 12.04 Beta 2 włącznie, jeśli używasz zaszyfrowanego katalogu domowego, musisz go zmodyfikować, /etc/pam.d/common-sessionaby go załadować ~/.pam_environment. To rozwiązanie najwyraźniej działa we wcześniejszych wersjach, ale go nie testowałem.

Guenther Montag (g-montag) napisał 19.08.2010:

Wydaje się, że jest to problem z zaszyfrowanymi katalogami domowymi. dodałem

wymagana sesja pam_env.so

na końcu /etc/pam.d/common-session, a teraz ~ / .pam_environment zostaje odczytany. W innym systemie bez zaszyfrowanych katalogów domowych (także 10.04) obejście nie jest potrzebne. Być może w moim przypadku system próbuje odczytać ~ / .pam_environment zanim zostanie odszyfrowany.

Na podstawie mojej odpowiedzi na Super User: https://superuser.com/a/408373/66856

Alain O'Dea
źródło
To nadal źle: ${HOME}nie będzie działać. Brak rozszerzenia w .pam_environment.
detly
2
@detly istnieje rozszerzenie .pam_environment, ale HOMEzwykle nie jest ustawione tak wcześnie. Gdyby ten wiersz był przeczytany DEFAULT=${PATH}/Applications/jdk, zobaczyłbyś wartość PATHwstawionej do niego.
muru