/etc/environment
jest oficjalnie poprawnym miejscem dla zmiennych systemowych dla całego systemu. Ale jak mogę ponownie załadować zadania w tym pliku bez ponownego uruchamiania lub ponownego logowania?
Co ciekawe, Google nie pomaga mi tutaj, oprócz dziesiątek postów na blogu sugerujących użycie
source /etc/environment
który oczywiście nigdy nie zadziała, ponieważ /etc/environment
jest to lista przypisań (po jednym w wierszu), a nie skrypt wykonywalny (stąd brakujące export
polecenia w /etc/environment
...).
ubuntu
environment-variables
fgysin
źródło
źródło
for line in $( cat /etc/environment ) ; do export $line ; done
, jeśli format pliku tokey=value
.export
...export
konieczne byłoby ... (bez niej nie jest to zwykłe - zmienna środowiskowa w bieżącej powłoce, niedostępna w procesach potomnych)Odpowiedzi:
Jedną z rzeczy, w których się mylisz, jest to, że
/etc/environment
wymaga ponownego uruchomienia w celu ponownego załadowania. To jest niepoprawne. Plik jest odczytywany tylko przy logowaniu , gdy aktywowany jest stos PAMpam_env.so
, a konkretnie ten , który czyta plik.Wylogowywanie i z powrotem w to zastosować zmiany - aw rzeczywistości musi to zrobić, jeśli chcesz, aby wszystkie procesy otrzymywać nowe środowisko . Wszystkie inne „rozwiązania” 2 zastosują środowisko tylko do procesu pojedynczej powłoki, ale nie do niczego uruchamianego przez GUI, w tym nowych okien terminali. 1
Jeśli jednak nie masz nic przeciwko - brakowi
export
komend można zrekompensować za pomocąset -a
iset +a
. Nadal jednak jest to kiepski sposób, ponieważ plik nie używa również cytowania. Ale to powinno działać dobrze:1 Menedżer sesji GNOME umożliwia zmianę własnego środowiska, ale tylko w
Initialization
fazie:2
gdb
nie jest rozwiązaniem, ale czasem można go użyć. Musisz dołączyć go do uruchomionych procesów menedżera sesji (np.gnome-session
), Menedżera okien (np.gnome-shell
Lubopenbox
), paska zadań / panelu, jeśli taki istnieje (np.xfce4-panel
), I ogólnie wszystkiego innego, co mogłoby uruchamiać rzeczy. Dla każdego z tych procesów musisz dołączyćgdb
do niego za pomocą PID, wywołaćputenv()
funkcję za pomocąp
, a następnie odłączyć za pomocąq
:Zauważ, że debugger wstrzymuje proces, dlatego musisz łączyć się z menedżerami okien do komponowania tylko z innego tty (wirtualnej konsoli) lub przez SSH, w przeciwnym razie ekran zawiesiłby się.
Oprócz tego powinieneś zaktualizować środowisko używane przez dbus-daemon:
W przypadku starszych systemów:
źródło
while read
Metoda odczytuje zstdin
, więc prawdopodobnie chcesz coś do niej rury (npcat /etc/environment | while ...
). Ale to nie będzie działać z cytatem sformatowanych plików środowiskowych (key="value"
)Nie jest to tak wyczerpujące, jak zaakceptowana odpowiedź, ale jeśli zacytowałeś zmienne w swoich
/etc/environment
plikach, obie poprzednie metody (które wexport $line
jakiś sposób wykorzystują ) pójdą źle i skończysz na cytowanych wartościach.sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh
for
(dzięki @ Tim-Jones):for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
źródło
sed 's/^/export /' /etc/environment
for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
set -a; source /etc/environment; set +a;
.