Какая польза от команды «экспорт»?

12

Я создал переменную среды в одном окне терминала и попытался отобразить ее в другом окне терминала. Это ничего не отображается.

$TEST=hello

После этого я экспортировал его и повторил echoпопытку в другом окне терминала. Результат был таким же, как и раньше.

export TEST 

но если я выполню тот же код при входе в систему (добавив код в ~/.profileфайл), переменные могут быть использованы любым терминальным окном. Что здесь происходит? Чем отличается выполнение кода в терминале от его выполнения при входе в систему?

DScript
источник

Ответы:

25

exportделает переменную чем-то, что будет включено в дочерние среды процессов. Это не влияет на другие уже существующие среды. В общем случае нет способа установить переменную в одном терминале и автоматически отобразить ее в другом терминале, среда для каждого процесса устанавливается отдельно.

Добавление его к вашему .profileделает так, что ваша среда будет настроена на включение этой новой переменной каждый раз, когда вы входите в систему. Таким образом, он не экспортируется из одной оболочки в другую, а вместо этого инструктирует новую оболочку включать ее при настройке начальной среды.

Эрик Ренуф
источник
1

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

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

Теперь в оболочке есть много переменных, которые можно просматривать set(в оболочках типа Bourne Shell, не знаю о C Shell). Эти переменные не являются переменными среды, если они не являются exportред. Переменные среды можно просматривать с помощью env. Если вы запускаете программу из командной строки оболочки, программа унаследует переменные среды от оболочки. Аналогично для программы, запускаемой из сценария оболочки.

Поэтому при входе в систему существует оболочка, которая считывает данные профиля (например ~/.profile) и наследует их практически всем детям, внукам и так далее. Вот как настройки переменных среды просачиваются из оболочки входа или сценария входа во все другие программы, запускаемые в ходе сеанса входа.

Я создал переменную среды в одном окне терминала и попытался отобразить ее в другом окне терминала. Это ничего не отображается.

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

$TEST=hello

В любом случае это вряд ли сработает, если только расширение переменной не отключено или $TESTуже имеет подходящее значение. Если вы хотите присвоить helloпеременную, TESTвы должны сказать TEST=hello(примечание: нет $).

После этого я экспортировал его и повторил echoпопытку в другом окне терминала. Результат был таким же, как и раньше.

Еще раз, это ожидаемый результат.

но если я выполню тот же код при входе в систему (добавив код в ~/.profileфайл), переменные могут быть использованы любым терминальным окном.

Это связано с тем, что оболочка в терминале является потомком оболочки, которая считывает настройки среды ~/.profileи таким образом наследует эти настройки.

countermode
источник