getopt_long vs getopt_long_only

Чтобы сделать правильное приложение в стиле Linux/unix, что является лучшим выбором (например, afaik ls использует getopt_long, но, например, ffmpeg getopt_long_only). Какой из них вы рекомендуете?

Ура,

4 ответа

На мой взгляд, обычно справедливы следующие вещи:

  • Пользователи любят длинные, естественные языковые варианты, потому что их легко запомнить.
  • Пользователи, которые пишут сценарии для переноса программ с сотнями параметров, любят короткие варианты.

Если программа становится достаточно большой, в конечном итоге у нее заканчиваются короткие комбинации опций, которые имеют какой-либо смысл по сравнению с канонической опцией. Например, -Z может совпадать с длинным параметром, который начинается с совершенно другой буквы. В этот момент, особенно для одного сопровождающего, код разбора опций становится головной болью для поддержки.

У вас есть несколько вариантов, когда это произойдет:

  • Используйте что-то вроде gengetopt, чтобы написать этот код для вас из шаблона
  • Используйте только длинные варианты (обычно плохая идея)
  • Попробуйте сохранить свою программу до 52 вариантов (аз-аз) (обычно плохая идея)
  • Реализуйте параметры, где короткие параметры просто становятся переключателями, которые не принимают аргументов, используйте длинные параметры для тех, которые делают
  • Множество других методов, которые имеют смысл для вас и мало для пользователей

Смешайте в разных местах, и вы действительно начинаете понимать боль.

Когда я сажусь, чтобы написать инструмент, который принимает множество опций, первое, что я обычно делаю, это пишу код для разбора аргументов, это помогает планировать поток программы и становится наброском. Вы просто заставляете каждый вариант работать после этого.

Другими словами, если вы попадаете в точку, где варианты становятся такой хронической болью, это обычно указывает на программу, которая быстро развивалась за пределами ее планирования.

В любом случае, чтобы завершить мой длинный многоплановый ответ, обычно лучше по возможности поддерживать поведение compat getopt(). Код, который получает инструкции от пользователя - это всего лишь расходы на ведение бизнеса, поэтому вам следует полностью задуматься о том, что делает его более удобным для пользователя, когда это возможно.

Я бы сказал, что для "правильного стиля gnu/linux" вы должны использовать getopt_long() и предоставлять длинные опции для большинства опций (и иногда только для длинных опций). Большинство интерфейсов командной строки следуют этому.

Ни. Пользователь либо argp_parse или libpopt.

Я никогда не использовал getopt_long_only, но кажется, что он должен был бы делать больше поисков, так как он должен смотреть на длинные и короткие опции, если неизвестный флаг начинается с одного -:

Если параметр, начинающийся с "-" (не "-"), не соответствует длинному, но соответствует короткому, он анализируется как короткий.

- man getopt_long_only

Другие вопросы по тегам