Подтвердить что ты не робот

Настройка переменной окружения во всем мире без перезапуска Ubuntu

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

/etc/environment

или

/etc/profile

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

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

4b9b3361

Ответ 1

Эта программа 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.

Ответ 2

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

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

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

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

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

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

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

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

  • Скорее всего, если вы сделаете "нейтральные по размеру" изменения, вы могли бы задумать исправление всех сред всех процессов. Например, замените каждую переменную среды USER=foo (если она есть), с помощью USER=bar. Я опасаюсь довольно частного случая.

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

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

Ответ 3

Конечно export VAR=value

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

Ответ 4

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

Итак, вместо настройки /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`

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

Ответ 5

Запустите эту команду в терминале

$source /etc/profile