getopt_long vs getopt_long_only - PullRequest
       112

getopt_long vs getopt_long_only

4 голосов
/ 03 февраля 2010

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

Приветствия

Ответы [ 4 ]

5 голосов
/ 15 марта 2010

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

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

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

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

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

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

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

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

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

2 голосов
/ 15 марта 2010

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

1 голос
/ 03 февраля 2010

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

0 голосов
/ 03 февраля 2010

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

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

- man getopt_long_only

...