Программирование для Linux. Профессиональный подход | страница 22



Некоторые переменные должны быть знакомы большинству читателей, например:

■ >USER — содержит имя текущего пользователя;

■ >HOME — содержит путь к начальному каталогу текущего пользователя;

■ >PATH — содержит разделенный двоеточиями список каталогов, которые операционная система просматривает в поиске вызванной программы;

■ >DISPLAY — содержит имя и номер экрана сервера X Window, на котором отображаются окна графических программ.

Интерпретатор команд, как и любая другая программа, располагает своей средой. Имеются средства просмотра и редактирования переменных среды из командной строки. Например, программа >printenv отображает текущую среду интерпретатора. В разных интерпретаторах есть свой встроенный синтаксис работы с переменными среды. Ниже демонстрируется синтаксис интерпретаторов семейства Bourne shell.

■ Интерпретатор автоматически создает локальную переменную (называемую переменной интерпретатора) для каждой обнаруживаемой им переменной среды. Благодаря этому возможен доступ к переменным среды через выражения вида >$переменная. Например:

>% echo $USER

>samuel

>% echo $HOME

>/home/samuel

■ С помощью команды >export можно экспортировать переменную интерпретатора в переменную среды. Вот как, например, задается значение переменной >EDITOR:

>% EDITOR=emacs

>% export EDITOR

Или короче:

>% export EDITOR=emacs

В программе доступ к переменным среды осуществляет функция >getenv(), объявленная в файле >. В качестве аргумента она принимает имя переменной и возвращает се значение в строковом виде или >NULL, если переменная не определена в данной среде. Для установки и сброса значений переменных среды предназначены функции >setenv() и >unsetenv() соответственно.

Получить список всех переменных среды немного сложнее. Для этого нужно обратиться к специальной глобальной переменной >environ, определенной в GNU-библиотеке языка С. Данная переменная имеет тип >char** и представляет собой массив указателей на символьные строки, последним элементом которого является >NULL. Каждая строка имеет вид >ПЕРЕМЕННАЯ=значение.

Программа, представленная в листинге 2.3, отображает всю свою среду, просматривая в цикле массив >environ.

Листинг 2.3. (print-env.c) Вывод переменных среды

>#include


>/* Массив ENVIRON содержит среду выполнения. */

>extern char** environ;


>int main() {

> char** var;

> for (var = environ; *var != NULL; ++var)

>  printf("%s\n", *var);

> return 0;

>}

He пытайтесь модифицировать массив >environ самостоятельно. Пользуйтесь для этих целей функциями