ENVIRON(7) Руководство программиста Linux ENVIRON(7)

ИМЯ

environ - пользовательское окружение

ОБЗОР

extern char **environ;

ОПИСАНИЕ

Переменная environ указывает на массив указателей на строки, который называют «окружением» (environment). Последний указатель в этом массиве имеет значение NULL (данная переменная должна быть объявлена в программе пользователя, а кроме того она объявлена в заголовочном файле <unistd.h>, если определён макрос тестирования свойств _GNU_SOURCE). Указанный массив строк, становится доступным процессу после вызова exec(3), которая запускает процесс. Если дочерний процесс создаётся с помощью fork(2), то он наследует копию окружения своего родителя.

По договорённости, строки в environ имеют вид «имя=значение». Вот некоторые примеры:

Имя пользователя, зарегистрированного в системе (используется некоторыми программами, написанными для BSD).
Имя пользователя, зарегистрированного в системе (используется некоторыми программами, написанными для System-V).
Домашний каталог пользователя, устанавливается программой login(1) согласно значению из файла паролей passwd(5).
Имя локали используется для категорий локали, если не заменено значением LC_ALL или более специфичными переменными окружения, такими как LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC и LC_TIME (подробней смотрите описание переменных окружения LC_* в locale(7)).
Последовательность каталогов, которые sh(1) и многие другие программы будут применять в качестве префикса при поиске файла, если он задан неполным именем Каталоги разделяются «:» (похожим образом переменная CDPATH используется некоторыми командными оболочками для поиска каталога, в который нужно перейти, MANPATH используется командой man(1) для поиска справочных страниц и т. д.).
Текущий рабочий каталог. Устанавливается некоторыми командными оболочками.
Имя регистрационной командной оболочки пользователя.
Тип терминала, для которого будет подготавливаться вывод.
Предпочитаемая пользователем утилита просмотра текстовых файлов.
Предпочитаемая пользователем утилита редактирования текстовых файлов.

Имена можно помещать в окружение оболочки с помощью команды export в sh(1) или командой setenv, если используется csh(1).

Начальное окружение оболочки создаётся различными путями, например из файла /etc/environment, который обрабатывается pam_env(8) при входе любого пользователя (в системах с pam(8)). Также, различные сценарии инициализации оболочки, такие как системный сценарий /etc/profile и локальный пользовательский сценарий инициализации могут содержать команды, могут добавлять переменные в окружение оболочки; подробности смотрите в справочной странице на предпочитаемую оболочку.

Оболочки, подобные Bourne, поддерживают синтаксис

ИМЯ=значение команда

для создания определения переменной окружения только в процессе, который выполняет команду. Перед командой можно указывать несколько определений переменных, разделяя их пробельным символом.

При вызове exec(3) в окружение также могут быть помещены и аргументы. Программа, написанная на языке C, может изменять своё окружение с помощью функций getenv(3), putenv(3), setenv(3) и unsetenv(3).

Заметим, что наличие или значения определённых переменных окружения может отказывать влияние на поведение многих программ и библиотечных процедур. Примеры:

  • Переменные LANG, LANGUAGE, NLSPATH, LOCPATH, LC_ALL, LC_MESSAGES и т. д. влияют на работу с локалью; смотрите catopen(3), gettext(3) и locale(7).
  • Переменная TMPDIR влияет на путь файлов, создаваемых tempnam(3) и некоторыми другими процедурами, а также на временный каталог, который используется sort(1) и некоторыми другими программами.
  • Переменные LD_LIBRARY_PATH, LD_PRELOAD и другие LD_* влияют на поведение динамического загрузчика/компоновщика.
  • Переменная POSIXLY_CORRECT влияет на определённые программы и библиотечные вызовы таким образом, что они включают режим соответствия POSIX.
  • На поведение malloc(3) оказывают влияние переменные MALLOC_*.
  • В переменной HOSTALIASES задаётся имя файла, содержащего псевдонимы имени узла, которые будут использованы в функции gethostbyname(3).
  • В переменных TZ и TZDIR указывается информация о часовом поясе; они используются в функциях tzset(3), ctime(3), localtime(3), mktime(3), strftime(3). Смотрите также tzselect(8).
  • В переменной TERMCAP указывается информация по работе с терминалом (можно указать имя файла, содержащего такую информацию).
  • Через переменные COLUMNS и LINES приложение может узнать о размере окна (возможно указать ненастоящий размер).
  • В переменной PRINTER или LPDEST можно указать предпочтительный для печати принтер. Смотрите lpr(1).

ЗАМЕЧАНИЯ

Операции prctl(2) PR_SET_MM_ENV_START и PR_SET_MM_ENV_END можно использовать для управления расположением окружения процесса.

ДЕФЕКТЫ

Честно говоря, использование переменных окружения таит в себе проблемы с безопасностью. Многие системные команды могут неправильно работать, если пользователь укажет неправильные значения для переменной IFS или LD_LIBRARY_PATH.

Также есть риск засорения пространства имен. Такие программы как make и autoconf позволяют заменять имена используемых по умолчанию утилит через переменные окружения. Например, переменная CC используется для выбора нужного C-компилятора (и, похожим образом, можно использовать переменные MAKE, AR, AS, FC, LD, LEX, RM, YACC и т.д.). Однако, есть случаи, когда в переменных окружения задают параметры программ, а не их имена (например, MORE, LESS и GZIP). Использование таких имён для переменных окружения является ошибочным и не должно применяться в новых программах. Авторы gzip должны бы переименовать переменную в GZIP_OPT.

СМОТРИТЕ ТАКЖЕ

bash(1), csh(1), env(1), login(1), printenv(1), sh(1), tcsh(1), execve(2), clearenv(3), exec(3), getenv(3), putenv(3), setenv(3), unsetenv(3), locale(7), ld.so(8), pam_env(8)

2017-09-15 Linux