Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
2.4.2. Окружение в целом:
environПравильным способом работы с окружением является использование функций, описанных в предыдущем разделе. Однако, стоит взглянуть на то, как это работает «под капотом».
Внешняя переменная
environargvenvironextern char **environ; /* Смотрите, нет заголовочного файла POSIX */Как и в
argvenvironNULLargc/* ch02-printenv.c --- Распечатать окружение. */#include <stdio.h>extern char **environ;int main(int argc, char **argv) { int i; if (environ != NULL) for (i = 0; environ[i] != NULL; i++) printf("%sn", environ[i]); return 0;}Хотя это и маловероятно, перед попыткой использовать
environNULLПеременные хранятся в окружении в случайном порядке. Хотя некоторые оболочки Unix хранят переменные окружения в отсортированном по именам переменных виде, это формально не требуется, и многие оболочки не сортируют их.
В качестве уловки реализации можно получить доступ к окружению, объявив третий параметр
main()int main(int argc, char **argv, char **envp) { ...}Затем можно использовать
envpenvironenviron2.4.3. GNU
envЧтобы завершить главу, рассмотрим GNU версию команды
envgetopt_long()$ env --helpUsage: env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]/* Устанавливает соответствующее VALUE для каждого NAME и запускает COMMAND */-i, --ignore-environment /* запустить с пустым окружением */-u, --unset=NAME /* удалить переменную из окружения */--help /* показать этот экран справки и выйти */--version /* вывести информацию о версии и выйти *//* Простое - предполагает -1. Если не указана COMMAND, отображает имеющееся окружение.Об ошибках сообщайте в <[email protected]>. */Вот несколько примеров вызовов команды:
$ <b>env - myprog arg1</b> /* Очистить окружение, запустить программу с args */$ <b>env - РАТН=/bin:/usr/bin myprog arg1</b> /* Очистить окружение, добавить PATH, запустить программу */$ <b>env -u IFS PATH=/bin:/usr/bin myprog arg1</b> /* Сбросить IFS, добавить PATH, запустить программу */Код начинается со стандартной формулировки авторских прав GNU и разъясняющего комментария. Мы для краткости их опустили. (Формулировка авторского права обсуждается в Приложении С «Общедоступная лицензия GNU». Показанного ранее вывода
--helpN_("string")80 #include <config.h>81 #include <stdio.h>82 #include <getopt.h>83 #include <sys/types.h>84 #include <getopt.h>8586 #include "system.h"87 #include "error.h"88 #include "closeout.h"8990 /* Официальное имя этой программы (напр., нет префикса 'g'). */91 #define PROGRAM_NAME "env"9293 #define AUTHORS N_ ("Richard Mlynarik and David MacKenzie")9495 int putenv();9697 extern char **environ;9899 /* Имя, посредством которого эта программа была запущена. */100 char *program_name;101102 static struct option const longopts[] =103 {