extern char **environ; /* Смотрите, нет заголовочного файла POSIX */
Как и в
argv
, завершающим элементом
environ
является
NULL
. Однако, здесь нет переменной «числа строк окружения», которая соответствовала бы
argc
. Следующая простая программа распечатывает все окружение:
/* 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("%s\n", environ[i]);
return 0;
}
Хотя
это и маловероятно, перед попыткой использовать
environ
эта программа проверяет, что она не равна
NULL
.
Переменные хранятся в окружении в случайном порядке. Хотя некоторые оболочки Unix хранят переменные окружения в отсортированном по именам переменных виде, это формально не требуется, и многие оболочки не сортируют их.
В качестве уловки реализации можно получить доступ к окружению, объявив третий параметр
main
:
int main(int argc, char **argv, char **envp) {
...
}
Затем можно использовать
envp
также, как
environ
. Хотя это иногда можно увидеть в старом коде, мы не рекомендуем такое использование;
environ
является официальным, стандартным, переносимым способом получения доступа ко всему окружению, если это вам необходимо.
2.4.3. GNU
env
Чтобы завершить главу, рассмотрим GNU версию команды
env
. Эта команда добавляет переменные к окружению в ходе выполнения одной команды. Она может использоваться также для очищения окружения в ходе этой команды или для удаления отдельных переменных окружения. Программа обеспечивает нас двойной функциональностью, поскольку проявляет возможности как
getopt_long
, так и несколько других возможностей, обсуждавшихся в этом разделе. Вот как вызывается программа:
Код начинается со стандартной формулировки авторских прав GNU и разъясняющего комментария. Мы для краткости их опустили. (Формулировка авторского права обсуждается в Приложении С «Общедоступная лицензия GNU». Показанного ранее вывода
– -help
достаточно для понимания того, как работает программа.) За объявленным авторским правом и комментарием следуют подключаемые заголовочные файлы и объявления. Вызов макроса '
N_("string")
' (строка 93) предназначен для использования при локализации программного обеспечения, тема, освещенная в главе 13 «Интернационализация и локализация». Пока вы можете рассматривать его, как содержащий строковую константу.
80 #include <config.h>
81 #include <stdio.h>
82 #include <getopt.h>
83 #include <sys/types.h>
84 #include <getopt.h>
85
86 #include "system.h"
87 #include "error.h"
88 #include "closeout.h"
89
90 /* Официальное имя этой программы (напр., нет префикса 'g'). */
91 #define PROGRAM_NAME "env"
92
93 #define AUTHORS N_ ("Richard Mlynarik and David MacKenzie")
94
95 int putenv;
96
97 extern char **environ;
98
99 /* Имя, посредством которого эта программа была запущена. */
GNU Coreutils содержит большое число программ, многие из которых выполняют одни и те же общие задачи (например, анализ аргументов). Для облегчения сопровождения многие типичные идиомы были определены в виде макросов. Двумя таким макросами являются
GETOPT_HELP_OPTION_DECL
и
GETOPT_VERSION_OPTION
(строки 106 и 107). Вскоре мы рассмотрим их определения. Первая функция,
usage
, выводит информацию об использовании и завершает программу. Макрос
_("string")
(строка 115, используется также по всей программе) также предназначен для локализации, пока также считайте его содержащим строковую константу.