Установка переменной среды глобально без перезапуска Ubuntu - PullRequest
23 голосов
/ 30 декабря 2011

Я знаю, что общесистемные переменные среды можно установить, добавив записи в

/etc/environment

или

/etc/profile

Но для этого требуется перезапуск системы или перезапуск X.

Можно ли установить переменную окружения в Ubuntu / Linux так, чтобы она сразу была доступна для всей системы без перезапуска ОС или выхода из системы?

Ответы [ 4 ]

16 голосов
/ 10 мая 2013

Простой ответ: вы не можете сделать это вообще .

Почему не может быть общего решения?

Почему?нужно более подробное объяснение.В Linux среда зависит от процесса.Каждая среда процесса хранится в специальной области памяти, выделенной исключительно для этого процесса.

В качестве отступления: чтобы быстро проверить среду процесса, взгляните на /proc/<pid>/env (или попробуйте /proc/self/env для среды запущенного в данный момент процесса, например вашей оболочки).

Когда (родительский) процесс запускает другой (дочерний) процесс (через fork(2)), средасреда родителя копируется , чтобы создать среду ребенка.После этого между этими двумя средами нет никакой ассоциации в стиле наследования, они полностью разделены.Таким образом, не существует «глобальной» или «основной» среды, которую мы могли бы изменить, чтобы добиться того, чего вы хотите.

Почему бы просто не изменить среду для каждого процесса всех запущенных процессов?Область памяти для среды находится в четко определенном месте (в основном прямо перед памятью, выделенной для стека), поэтому вы не можете легко расширить ее, не повредив другие критические области памяти процесса.

Возможные полу-решения для особых случаев

Тем не менее, можно представить несколько особых случаев, когда вы действительно можете достичь того, что вы хотите.

  • Mostочевидно, что если вы делаете «нейтральные по размеру» изменения, вы, возможно, сможете исправить все среды всех процессов.Например, замените каждую переменную среды USER=foo (если имеется) на USER=bar.Боюсь, это довольно частный случай.

  • Если вам не нужно менять среду всех процессов, а только класс известных, более креативные подходы могутбыть возможным Ответ Ворспрунга является впечатляющей демонстрацией выполнения именно этого только с процессами Bash.

Вероятно, существует множество других особых случаев, где возможное решение.Но, как объяснено выше: нет решения для общего случая.

14 голосов
/ 09 мая 2013

Эта perl-программа использует gdb для изменения переменной USER во всех работающих в настоящее время оболочках bash на значения, заданные в качестве аргумента программы. Чтобы установить новую переменную, можно использовать внутренний вызов bash "set_if_not"

#!/usr/bin/perl

use strict;
use warnings;

my @pids = qx(ps -C bash -o pid=);
my $foo  = $ARGV[0];
print "changing user to $foo";
print @pids;

open( my $gdb, "|gdb" ) || die "$! gdb";
select($gdb);
$|++;
for my $pid ( @pids ) {
    print "attach $pid\n";
    sleep 1;
    print 'call bind_variable("USER","' . $foo . '",0)' . "\n";
    sleep 1;
    print "detach\n";
}

Этот только работает с bash (я только протестировал его с версией 4.1 на Ubuntu 10.04 LTS) и не изменяет среду для произвольных уже запущенных программ. Очевидно, что он должен быть запущен от имени пользователя root.

4 голосов
/ 30 декабря 2011

Конечно export VAR=value

Вы также можете просто source /etc/profile снова

1 голос
/ 22 августа 2013

Боюсь, что решение здесь разочаровывает: не используйте переменные окружения.Вместо этого используйте файл.

Итак, вместо настройки / etc / environment с помощью:

SPECIAL_VAR='some/path/I/want/later/'

И вызова его с помощью:

$SPECIAL_VAR

Вместо этого создайтефайл в ~ / .yourvars с содержимым:

SPECIAL_VAR='some/path/I/want/later/'

И каждый раз, когда вам нужна переменная, отправляйте исходные данные:

cd `source ~/.yourvars; echo $SPECIAL_VAR`

Взломать?Может быть.Но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...