Вопрос Как перезагрузить / etc / environment без перезагрузки?


/etc/environment является официально правильное место для переменных среды системы. Но как я могу перезагружать присвоения в этом файле без перезагрузки или переустройства?

Интересно, что Google не помогает мне здесь, кроме десятков сообщений в блогах, предлагающих использовать

source /etc/environment

которые, очевидно, будут никогда не работать потому как /etc/environment представляет собой список ассигнований (по одной в строке) и не исполняемый скрипт (следовательно, отсутствует export команд в /etc/environment ...).


132
2017-09-25 11:27


происхождения


Общенационально, я понятия не имею. Для текущего сеанса оболочки вы можете использовать for line in $( cat /etc/environment ) ; do export $line ; done, если формат файла key=value, - Daniel Beck♦
Работает для меня без export... - Izkata
@lzkata: Если переменная уже экспортирована, нет необходимости экспортировать ее снова ... Если добавлена ​​новая переменная, которая еще не экспортирована, export (без него это просто нормальная переменная non-environment в текущей оболочке, недоступная в дочерних процессах) - Gert van den Berg
@DanielBeck благодарю вас ..plz добавить комментарий как ответ! - Waleed Gadelkareem
это работает также на debian и centos? - Massimo


ответы:


Вы ошибаетесь в том, что /etc/environment требуется перезагрузка для перезагрузки. Это неверно. Единственный раз, когда файл читается, - это по логину, когда стек PAM активирован - в частности pam_env.so, который читает файл.

Выход из системы и обратно будут применять изменения - и на самом деле вы должен сделайте это, если вы хотите, чтобы все ваши процессы получили новую среду, Все остальные «решения»2 будет применять среду только к процессу одиночной оболочки, но не к чему-либо, что вы запускаете через графический интерфейс, включая новые окна терминала.1

Если вы в порядке с этим, то - отсутствие export команды могут быть скомпенсированы set -a а также set +a, Тем не менее, он по-прежнему остается слабым, поскольку файл также не использует цитирование. Но это должно работать нормально:

while read -r env; do export "$env"; done

1 Менеджер сеансов GNOME предоставляет возможность изменить свою собственную среду, но только во время 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-демоном:

$ 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'}"
()

103
2017-09-25 14:52



Я только что проверил, прочитав -r env; делать экспорт «$ env»; сделано на Ubuntu 16.04, и это ошибки. Хотите узнать больше? - Frank
while read метод читается из stdin, поэтому вы, вероятно, захотите что-то на него направить (например, cat /etc/environment | while ...). Но это не будет работать с форматированными файлами окружения (key="value") - villasv


Это не так полно, как принятый ответ, но если вы указали переменные в своем /etc/environment файлы обоих предыдущих методов (которые используют export $line так или иначе) пойдет не так, и вы закончите с указанными значениями.

  • Вариант 1: с временным исходным файлом

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Вариант 2: с встроенным for (спасибо @ tim-jones):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done


5
2017-08-14 20:12



Короче: eval sed 's/^/export /' /etc/environment - Aaron McMillin
Версия не-temp-файла выше: for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done - Tim Jones
Еще короче: set -a; source /etc/environment; set +a;, - ulidtko