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 PAM pam_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
i set +a
. Nadal jednak jest to kiepski sposób, ponieważ plik nie używa również cytowania. Ale to powinno działać dobrze:
while read -r env; do export "$env"; done
1 Menedżer sesji GNOME umożliwia zmianę własnego środowiska, ale tylko w Initialization
fazie:
$ gdbus call -e -d org.gnome.SessionManager \
-o /org/gnome/SessionManager \
-m org.gnome.SessionManager.Setenv \
"FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
interface is only available during the Initialization phase
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
Lub openbox
), 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
:
$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6
(gdb) p putenv("FOO=bar")
$1 = 0
(gdb) p putenv("BAZ=qux")
$2 = 0
(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718
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:
$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux
W przypadku starszych systemów:
$ gdbus call -e -d org.freedesktop.DBus \
-o /org/freedesktop/DBus \
-m org.freedesktop.DBus.UpdateActivationEnvironment \
"{'FOO': 'bar', 'BAZ': 'qux'}"
()
for line in $( cat /etc/environment ) ; do export $line ; done
, jeśli format pliku tokey=value
.