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() и предоставлять длинные опции для большинства опций (и иногда только для длинных опций). Большинство интерфейсов командной строки следуют этому.
Я никогда не использовал getopt_long_only, но кажется, что он должен был бы делать больше поисков, так как он должен смотреть на длинные и короткие опции, если неизвестный флаг начинается с одного -
:
Если параметр, начинающийся с "-" (не "-"), не соответствует длинному, но соответствует короткому, он анализируется как короткий.
- man getopt_long_only