Для чего нужна команда «экспорт»?

Это невозможно. Systemd не интерактивен.

11
29.01.2018, 03:35
1 ответ

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

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

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

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

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

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

$TEST=hello

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

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

И снова это ожидаемый результат.

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

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

1
27.01.2020, 19:57

Теги

Похожие вопросы