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