Предположим, кто-то запускает ./my-command -a100b
.Я хочу, чтобы моя программа сообщила, что есть опция -a
с аргументом 100 и a -b
.Однако getopt анализирует это как параметр -a
с аргументом 100b
.
Да, это так.Вот как работает язык опций, анализируемый getopt()
.
Как я могу сказать getopt, что он не завершил синтаксический анализ -a100b
?Я хочу сказать, чтобы getopt начал синтаксический анализ символа b
, чтобы он распознал наличие опции -b
.
Вы не можете.Ни POSIX-стандарт getopt()
, ни какая-либо известная мне расширенная версия (например, GNU) не поддерживают такую вещь.В частности, спецификация POSIX для getopt
говорит, в частности,
Функция getopt()
- это синтаксический анализатор командной строки, который должен следовать Синтаксическим указаниям утилит 3, 4, 5, 6, 7, 9 и 10 в Руководстве по синтаксису утилиты XBD.
Эти рекомендации касаются параметров командной строки и их форматирования.Наиболее важными для вашего вопроса являются:
Рекомендация 3: Каждое имя параметра должно быть одним буквенно-цифровым символом (классификацией символов alnum) из переносимого набора символов.[...]
Указание 4: Перед всеми параметрами должен стоять символ «-».
Указание 5: Один илидополнительные параметры без аргументов-параметров, за которыми следует не более одного параметра, который принимает аргумент-параметр, должны приниматься при группировании за одним разделителем '-'.
Рекомендация 6: Каждый параметр иoption-аргумент должен быть отдельным аргументом, за исключением того, что отмечено в Синтаксисе аргумента утилиты, пункт (2).
Обратите особое внимание на правило 5: когда вы группируете опции вместе, только последний может быть тем, который принимаетАргумент.Это позволяет интерпретировать хвост этой группы или следующий полный аргумент как аргумент, что вы и делаете getopt
.
Конечно, если вы хотите, чтобы ваша программа принимала параметры, которые не соответствуютв соответствии с рекомендациями POSIX, вы можете сделать это, но вам, вероятно, потребуется выполнить собственный анализ параметров.Может быть, вы можете получить getopt
, чтобы помочь, но вам нужно будет добавить нетривиальный пользовательский слой разбора сверху.Это может быть проще, просто свернуть свое с нуля.