TL; DR
Te pliki konfiguracyjne globalne ( /etc/environment
, /etc/profile
) lub specyficzne dla użytkownika ( ~/.profile
, ~/.bashrc
) są przetwarzane tylko przy następnym logowaniu / sesji.
Te globalne pliki zastosowanie do wszystkich użytkowników (nie tylko roota) ... ale trzeba zrestartować sesji użytkownika, aby zobaczyć odzwierciedleniem zmian w środowisku. Może się to zdarzyć, dzwoniąc su
jak zaobserwowałeś ... lub wylogowując się / logując lub uruchamiając ponownie. Mógłbyś su
do użytkownika innego niż root i zobaczyłbyś, że oni również mają zmiany środowiska.
Powodem, dla którego musisz zrestartować się lub zalogować ponownie, aby uzyskać globalne środowisko, jest to, że środowisko jest dziedziczone z procesów nadrzędnych, a proces root dla wszystkiego, co uruchamiasz, to twoja powłoka logowania ... więc jeśli twoja powłoka logowania nie ma środowisko ... to też procesy nie zaczynają się w powłoce logowania. Możesz oczywiście ustawić / zaktualizować środowisko dla poszczególnych procesów podczas ich uruchamiania, ale musiałbyś ustawić środowisko dla powłoki logowania i zrestartować wszystkie podprocesy, aby zobaczyć zmianę.
Globalnego Środowiska
Jak ktoś inny wspomniano, potrzebny jest restart lub wylogowania / login, aby zmiany /etc/profile
, /etc/profile.d/*.sh
a /etc/environment
do odebrania.
Wynika to z faktu, że chociaż pliki te określają środowisko globalne ... są one uruchamiane tylko raz podczas logowania, więc istniejące dane logowania / sesje nie odzwierciedlają zmian w tych plikach. Ponowne uruchomienie „resetuje” login każdego użytkownika, zmuszając go do pobrania nowego środowiska.
W swojej własnej sesji logowania możesz source /etc/profile
w celu odebrania zmian bez ponownego uruchomienia komputera lub wylogowania / logowania ... ale to wpłynie tylko na twoją sesję i nowe procesy uruchomione w tej sesji.
Zauważ też, że nie ma interpolacji zmiennych /etc/environment
(nie jest to skrypt), więc nie możesz robić takich rzeczy PATH="$PATH:/my/custom/path"
.
Zauważ też, że /etc/profile
i /etc/profile.d/*.sh
są uruchamiane tylko dla sesji logowania, więc skonfigurowane środowisko nie będzie dostępne dla systemowych kont niezalogowanych (tj. Jeśli próbujesz ustawić zmienną środowiskową dla procesu demona, który działa poza powłoką logowania).
Zauważ, że bashrc
nie jest to przydatne do ustawiania środowiska dla całej powłoki logowania, ale dla powłok bash i podprocesów ... więc dla prawdziwej „globalnej” lub „globalnej użytkownika” prawdopodobnie chcesz umieścić konfigurację środowiska w /etc/profile
lub /etc/profile.d/my-custom-env.sh
lub ~/.profile
. Inne powłoki (np. Zsh) mają również własne pliki konfiguracyjne, więc konfiguracja środowiska niespecyficzna dla bash w bashrc spowoduje problemy lub zamieszanie, jeśli / podczas zmiany powłoki (lub gdy inni użytkownicy w systemie będą używać różnych powłok).
Częstym problemem jest instalowanie nowego programu i trzeba określić pewne środowisko, aby działało poprawnie. Globalne środowisko to jedna odpowiedź, ale często będzie wymagało restartu, który nie jest idealny dla serwerów i przypadków automatycznego udostępniania / konfigurowania przypadków użycia. Powinieneś zadać sobie pytanie, czy tak naprawdę jest to zmienna, której potrzebują wszyscy użytkownicy i programy w systemie, czy też jest to po prostu coś, co musisz udostępnić konkretnemu użytkownikowi lub programowi.
Dla konkretnego użytkownika
spójrz na włączenie środowiska w profilu lub bashrc w katalogu osobistym użytkownika (np. ~/.profile
~/.bashrc
) w zależności od tego, czy chcesz to dla interaktywnych, powłok logowania, tylko bash itp.
Należy pamiętać, że wymaga to również ponownego uruchomienia lub wylogowania / logowania, aby zmiany środowiska były dostępne dla wszystkich procesów w sesji logowania użytkownika. Użytkownik może source ~/.profile
... ale odbywa się to w terminalu i aktualizuje środowisko tylko w tej sesji terminala i procesach potomnych ... niekoniecznie dla całego środowiska logowania użytkownika.
W przypadku konkretnego programu istnieje kilka opcji.
Jednym z nich jest zapewnienie środowiska podczas uruchamiania polecenia:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
Jeśli używasz systemd, możesz również określić środowisko w pliku jednostki / usługi w obszarze za [Service]
pomocąEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
Ta opcja może wydawać się niezręczna, ponieważ musisz określać środowisko przy każdym uruchomieniu programu, ale jeśli środowisko jest naprawdę potrzebne tylko temu programowi ... to naprawdę najlepszy sposób i powinieneś się do niego przyzwyczaić i nie zrzucać wszystkiego do pliku bashrc lub profilu.
Jeśli nie używasz systemd lub init do konfigurowania środowiska i uruchamiania programu ... to oczywiście możesz po prostu owinąć wykonanie programu skryptem bash, w którym zapisujesz pełne polecenie łącznie z konfiguracją środowiska dla wygody.
Bibliografia:
Istnieje również bardzo szczegółowa odpowiedź tutaj, którą sugeruję przeczytać: /ubuntu//a/247769/824160
Dodanie zmiennej do
/etc/environment
mnie zadziałało.Jednak po zmianie musiałem zrestartować się, aby zmiana zaczęła
/etc/environment
obowiązywać. Samo zamknięcie i ponowne otwarcie okna terminala nie było wystarczające.źródło
source /etc/environment
aby go ponownie załadować.