Каждый процесс имеет несколько атрибутов, которые процесс может устанавливать индивидуально и независимо от других процессов. Примерами являются ограничения ресурсов, umask, текущий каталог, переменные окружения и некоторые другие. При создании процесса (посредством fork()
системного вызова) дочерний объект наследует эти атрибуты от родительского. После этого дочерний процесс может установить эти атрибуты произвольно. (Некоторые ограничения применяются, процесс не может увеличить жесткие ограничения ресурсов или изменить свой текущий каталог на каталог, для которого он не имеет разрешения exec.)
Лишь немногие программы изменяют свои переменные окружения, большинство не беспокоит. Предположим, последний случай. Таким образом, если дочерний процесс создает себе дополнительных потомков, то эти процессы будут иметь те же переменные среды, что и дедушка. И так далее.
Теперь в оболочке есть много переменных, которые можно просматривать set
(в оболочках типа Bourne Shell, не знаю о C Shell). Эти переменные не являются переменными среды, если они не являются export
ред. Переменные среды можно просматривать с помощью env
. Если вы запускаете программу из командной строки оболочки, программа унаследует переменные среды от оболочки. Аналогично для программы, запускаемой из сценария оболочки.
Поэтому при входе в систему существует оболочка, которая считывает данные профиля (например ~/.profile
) и наследует их практически всем детям, внукам и так далее. Вот как настройки переменных среды просачиваются из оболочки входа или сценария входа во все другие программы, запускаемые в ходе сеанса входа.
Я создал переменную среды в одном окне терминала и попытался отобразить ее в другом окне терминала. Это ничего не отображается.
По приведенному выше объяснению, это ожидаемый результат. Изменения в среде процесса затрагивают только тех детей этого процесса, которые созданы отныне, а не существующих.
$TEST=hello
В любом случае это вряд ли сработает, если только расширение переменной не отключено или $TEST
уже имеет подходящее значение. Если вы хотите присвоить hello
переменную, TEST
вы должны сказать TEST=hello
(примечание: нет $
).
После этого я экспортировал его и повторил echo
попытку в другом окне терминала. Результат был таким же, как и раньше.
Еще раз, это ожидаемый результат.
но если я выполню тот же код при входе в систему (добавив код в ~/.profile
файл), переменные могут быть использованы любым терминальным окном.
Это связано с тем, что оболочка в терминале является потомком оболочки, которая считывает настройки среды ~/.profile
и таким образом наследует эти настройки.