Scroll to navigation

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

ИМЯ

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

ОБЗОР

extern char **environ;

ОПИСАНИЕ

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

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

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

Вышеуказанные имена переменных могут быть помещены в окружение sh(1) командой export и «имя=значение», или командой setenv, если используется csh(1). При вызове exec(3) в окружение также могут быть помещены и аргументы. Программа, написанная на языке C, может изменять своё окружение с помощью функций getenv(3), putenv(3), setenv(3) и unsetenv(3).

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

Переменные LANG, LANGUAGE, NLSPATH, LOCPATH, LC_ALL, LC_MESSAGES и т.д. влияют на управление региональными настройками (см. locale(5)).

Переменная TMPDIR влияет на путь файлов, создаваемых tmpnam(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).

и т.д.

ДЕФЕКТЫ

Честно говоря, использование переменных окружения таит в себе проблемы с безопасностью. Многие системные команды могут неправильно работать, если пользователь укажет неправильные значения для переменной 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), login(1), sh(1), tcsh(1), execve(2), clearenv(3), exec(3), getenv(3), putenv(3), setenv(3), unsetenv(3), locale(5)

2009-07-25 Linux