Разобрать длинные опции, переданные из командной строки
#include <getopt.h>int getopt_long( int argc,char * const argv[],const char *optstring,const struct option *long_options,int *idx );int getopt_long_only( int argc,char * const argv[],const char *optstring,const struct option *long_options,int *long_idx );extern char *optarg;extern int optind, opterr, optopt, optreset;
":"
, опция имеет аргумент. Допустимые символы лишь включают буквы и цифры.NULL
.libc
Функция getopt_long() идентична getopt() за исключением того, что опции принимаются в двух формах: в виде целых слов или отдельных символов. Таким образом getopt_long() предоставляет расширенный набор функциональности относительно getopt(). Она может быть использована одним из двух способов.
В первом случае каждой длинной опции ставится в соответствие соответствующая короткая, а структура struct option используется только для их связывания. В данном случае getopt_long() функционирует идентично getopt(). Это позволяет достаточно просто привнести поддержку длинных опций в уже существующие программы с минимальными изменениями в коде.
Второй подход подразумевает установку указателя flag в структуре struct option, либо сохранение в структуре указателя на формат аргумента для опций, которые его подразумевают. Дополнительно, аргумент длинной опции может быть указан как опция, включающая знак "="
, например:
$ myprogram --myoption=somevalue
Когда длинная опция обнаружена, функция getopt_long() возвращает 0
. По этой причине обработка длинных опций по второй схеме не имеет обратной совместимости с getopt(). Комбинирование подходов возможно. Для этого следует связывать длинные опции с короткими лишь для некоторых элементов массива long_options.
Сокращенные (однобуквенные) имена длинных опций обрабатываются автоматически, но только в том случае, когда они уникальны на всем диапазоне записей массива long_options. Всегда предпочтительнее использовать полную форму длинной опции, так как возможны неоднозначные сценарии. Допустим, утилита имеет две опции: $ myprogram --o1-x --o1-y. При ее вызове в форме $ myprogram --o1 в общем случае не известно какая из опций будет обработана. Точный ответ на этот вопрос зависит от порядка следования элементов в массиве long_options.
По умолчанию getopt_long() представляет argv таким образом, что все аргументы опций в командной строке брабатываются перед аргументами, не ассоциированными с опциями. Если первый символ optstring это плюс ("+"
) или установлена переменная POSIXLY_CORRECT
, тогда argv обрабатывается по порядку; процессирование опций останавливается как только встречается первый не ассоциированный с опцией аргумент.
Функция getopt_long_only() работает аналогично getopt_long(), за исключением того, что длинные опции могут иметь префикс либо "-"
, либо "--"
. Если опция начинается с "-"
и не соответствует ни одной длинной опции, но соответствует короткой - используется последняя.
Данный раздел приводит сравнение GNU реализации функции и данной (соответствует BSD):
"-"
в строке опций (имеется в виду одиночный дефис): "-"
в строке опций не как аргумент. "-"
в строке опций соответствует одиночному дефису в командной строке. Данная функциональность сохранена для обратной совместимости с такими программами, как su
. Это ошибочная практика, ее следует всячески избегать в актуальных разработках.
"::"
в строке опций при наличии переменной окружения POSIXLY_CORRECT:
POSIXLY_CORRECT
игнорируется, а префикс "::"
используется для обозначения необязательности аргумента опции.
"+"
или "-"
) в строке опций не является ":"
: "?"
":"
.
"--a"
: "-"
, опцию "a"
. "--"
и возвращает -1
(игнорируя одиночный символ ‘a’).
NULL
поля struct option::flag: 0
(так как struct option::val не возвращается).
"-W"
("W;"
в строке опций): "-W"
). NULL
(аргумент длинной опции).
"-W"
с аргументом не являющимся (префиксом) известной длинной опции ("W;"
в строке опций): "-W"
с optarg, характеризующим неизвестную опцию. "?"
с установкой optopt в 0
и optarg в NULL
.
-1
, значение optind относительно текущей позиции опции).
NULL
— обе функции возвращают значение, ассоциированное с полем struct option::val, что обычно соответствует логике функции getopt().
NULL
— обе функции возвращают 0
и возвращает значение struct option::val по адресу, на который указывает flag. Функции также возвращают ":"
если был пропущен аргумент опции, "?"
если указана неизвестная или неоднозначная опция, и -1
когда список опций будет исчерпан.
"+"
в optstring игнорируется. int bflag, ch, fd;int daggerset;/* options descriptor */static struct option longopts[] = {{ "buffy", no_argument, NULL, 'b' },{ "fluoride", required_argument, NULL, 'f' },{ "daggerset", no_argument, &daggerset, 1 },{ NULL, 0, NULL, 0 }};bflag = 0;while ( (ch = getopt_long( argc, argv, "bf:", longopts, NULL )) != -1 )switch ( ch ){case 'b':bflag = 1;break;case 'f':if ( (fd = open( optarg, O_RDONLY, 0 )) == -1 )err( 1, "unable to open %s", optarg );break;case 0:if ( daggerset )fprintf( stderr, "Buffy will use her dagger to apply fluoride to dracula's teeth\n" );break;default:usage();}argc -= optind;argv += optind;
BSD, GNU
ЗОСРВ
«Нейтрино»
редакции 2018
Предыдущий раздел: Описание API системной библиотеки