Основы программирования в Linux
unknown option: qargument: hi thereНа самом деле и новые длинные опции, и исходные односимвольные можно смешивать. Длинным опциям также можно давать сокращенные названия, но они
должны отличаться от односимвольных опций. Длинные опции с аргументом можно задавать как единый аргумент в виде --опция= значение, как показано далее:
$ <b>./longopt --init -l --file=fred.с 'hi there'</b>option: ioption: lfilename: fred.сargument: hi thereДалее приведена новая программа longopt.c, полученная из программы argopt.c с изменениями, обеспечивающими поддержку длинных опций, которые в тексте программы выделены цветом.
#include <stdio.h>#include <unistd.h>#include <stdlib.h><i>#define _GNU_SOURCE</i><i>#include <getopt.h></i>int main(int argc, char *argv[]) {int opt;<i> struct option_longopts[] = {</i><i> {"initialize", 0. NULL, 'i'},</i><i> {"file" 1, NULL, 'f'},</i><i> {"list", 0, NULL, 'l'},</i><i> {0, 0, 0, 0}};</i><i> while ((opt = getopt_long(argc, argv, ":if:lr, longopts, NULL)) != -1) {</i>switch(opt) {case 'i':case 'l':case 'r':printf("option: %c\n", opt);break;case 'f':printf("filename: %s\n", optarg);break;case ':':printf("option needs a value\n");break;case '?':printf("unknown option: %c\n", optopt);break;}}for (; optind < argc; optind++)printf("argument: %s\n", argv[optind]);exit(0);}Как это работает
Функция
принимает два дополнительных параметра по сравнению с функциейgetopt_long. Первый из них — массив структур, описывающий длинные опции и сообщающий функцииgetoptспособ их обработки. Второй дополнительный параметр — адрес переменной, которая может использоваться как вариантgetopt_long, предназначенный для длинных опций; для каждой распознанной длинной опции ее номер в массиве длинных опций может быть записан в эту переменную. В данном примере вам не нужна эта информация, поэтому вы используетеoptindв качестве значения второго дополнительного параметра.NULLМассив длинных опций состоит из ряда структур типа
, в каждой из которых описано требуемое поведение длинной опции. Массив должен заканчиваться структурой, содержащей все нули.struct optionСтруктура длинной опции определена в заголовочном файле getopt.h и должна подключаться с помощью константы
, определенной для того, чтобы разрешить использование функции_GNU_SOURCE.getopt_longstruct option {const char *name;int has_arg;int *flag;int val;};Элементы структуры описаны в табл. 4.1.
Таблица 4.1.
Параметр опции Описание nameНазвание длинной опции. Сокращения будут приниматься до тех пор, пока они не создадут путаницы при определении названий других опций has_argПринимает ли эта опция аргумент. Задайте 0 для опций без аргументов, 1 для опций, у которых должно быть значение, и 2 для опций с необязательным аргументом flagЗадайте , чтобыNULLвернула при обнаружении данной опции значение, заданное вgetopt_long. В противном случаеvalвозвращает 0 и записывает значениеgetopt_longв переменную, на которую указываетvalflagvalЗначение для данной опции, предназначенное для возвратаgetopt_longДля получения сведений о других опциях, связанных с расширениями функции
в проекте GNU и родственных функциях, см. страницы интерактивного справочного руководства к функцииgetopt.getoptПеременные окружения
Мы обсуждали переменные окружения в главе 2. Это переменные, которые могут использоваться для управления поведением сценариев командной оболочки и других программ. Вы также можете применять их для настройки пользовательской среды. Например, у каждого пользователя есть переменная окружения
, определяющая его исходный каталог, стандартное место старта его или ее сеанса. Как вы видели, просмотреть переменные окружения можно из строки приглашения командной оболочки:HOME$ <b>echo $НOМЕ</b>/home/neilВы также можете воспользоваться командой оболочки
для получения списка всех переменных окружения.set