Одна вещь, в которой вы ошибаетесь, это то, что /etc/environment
для перезагрузки требуется перезагрузка. Это неверно Единственный раз, когда файл читается, это при входе в систему , когда активируется стек PAM, в частности pam_env.so
, который читает файл.
Выход из системы и повторный вход будут применять изменения - и на самом деле вы должны сделать это, если хотите, чтобы все ваши процессы получили новую среду . Все остальные «решения» 2 будут применять среду только к одному процессу оболочки, но не ко всему, что вы запускаете через графический интерфейс, включая новые окна терминала. 1
Однако, если вы согласны с этим - отсутствие export
команд можно компенсировать с помощью set -a
и set +a
. Тем не менее, это все еще плохой способ, поскольку файл также не использует кавычки. Но это должно работать нормально:
while read -r env; do export "$env"; done
1 GNOME Session Manager предоставляет способ изменить свою собственную среду, но только на Initialization
этапе:
$ 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
не является решением, но иногда может использоваться. Вы должны прикрепить его к запущенным процессам вашего менеджера сеансов (например gnome-session
), вашего оконного менеджера (например, gnome-shell
или openbox
), панели задач / панели, если таковые имеются (например xfce4-panel
), и вообще ко всему, что, возможно, могло бы запустить вещи. Для каждого из этих процессов вам нужно присоединиться gdb
к нему с помощью PID, вызвать putenv()
функцию с помощью p
, а затем отключить с помощью 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
Обратите внимание, что отладчик приостанавливает процесс, поэтому вы должны подключаться к оконным менеджерам композитинга только из другого tty (виртуальной консоли) или через SSH, иначе экран зависнет.
В дополнение к этому, вы также должны обновить среду, используемую dbus-daemon:
$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux
Для старых систем:
$ 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
, если формат файлаkey=value
.