В системах POSIX (например, Linux, MacOSX), по крайней мере, для программ, которые могут быть запущены в терминале оболочки (например, в большинстве из них), я бы рекомендовал использовать соглашения о кодировании GNU (в которых также перечислены общие имена аргументов) и заглянуть в рекомендации утилит POSIX. даже для проприетарного программного обеспечения:
всегда обрабатывать --version
и--help
(даже /bin/true
принимает их !!). Я проклинаю авторов программного обеспечения, не понимая --help
, я ненавижу их (потому что prog --help
это первая команда, которую я пробую в новой программе)! Часто --help
может быть сокращено как-h
Пусть в --help
сообщении перечисляются все параметры (если у вас их слишком много ... в этом случае перечислите наиболее распространенные и явно ссылаетесь на некоторую man
страницу или URL) и значения параметров по умолчанию, и, возможно, важные (и специфичные для программы) ) переменные среды. Показать эти списки опций при ошибке аргумента опции.
принять -a
короткий аргумент (одна буква) и иметь некоторый эквивалент --long-argument
, поэтому -a2
--long-argument=2
, --long-argument 2
; конечно, вы можете иметь (для редко используемых опций) какое-то --only-long-argument
имя; поскольку модальные аргументы без дополнительных опций -cf
обычно обрабатываются как -c -f
и т. д., так что ваше -argument:value
предложение странное, и я не рекомендую этого делать.
используйте GLIBC getopt_long или лучше (например, argp_parse , в OCaml это Arg
модуль , ...)
часто используется -
для стандартного ввода или вывода (если вы не можете этого сделать, работайте /dev/stdin
и /dev/stdout
даже в тех операционных системах, где их нет)
подражать поведению подобных программ путем повторного использования большинства их соглашений об опциях; в частности -n
для пробежек (а-ля make
), -h
для помощи, -v
для многословия и т. д ...
использовать в --
качестве разделителя между параметрами и файлом или другими аргументами
если ваша программа использует isatty
для проверки, чем stdin является терминалом (и в этом случае ведет себя «интерактивно»), предоставьте опцию принудительного включения неинтерактивного режима, аналогично, если ваша программа имеет интерфейс с графическим интерфейсом (и тестирует getenv("DISPLAY")
на рабочем столе X11), но может также использоваться в пакетной или командной строке.
Некоторые программы (например gcc
) принимают списки косвенных аргументов, поэтому @somefile.txt
имеет смысл читать аргументы программы из somefile.txt
; это может быть полезно, когда ваша программа может принимать очень много аргументов (больше, чем ваше ядро ARG_MAX
)
Кстати, вы могли бы даже добавить некоторые функции автозаполнения для вашей программы и обычных оболочек (например, bash
или zsh
)
Некоторые старые команды Unix (например dd
, или даже sed
) имеют странные командные аргументы для исторической совместимости. Я бы порекомендовал не следовать их вредным привычкам (если только вы не делаете из них лучший вариант).
Если ваше программное обеспечение представляет собой ряд взаимосвязанных программ командной строки, черпает вдохновение из мерзавца (который вы , конечно , использовать в качестве инструмента развития), который принимает git help
и git --help
и есть много git
subcommand
иgit
subcommand
--help
В редких случаях вы также можете использовать argv[0]
(используя символические ссылки в вашей программе), например, bash
вызывается как rbash
имеет другое поведение ( ограниченная оболочка). Но я обычно не рекомендую делать это; Это может иметь смысл, если ваша программа может использоваться как интерпретатор сценариев с использованием shebang, т.е. #!
в первой строке, интерпретируемой execve (2) . Если вы делаете такие трюки, обязательно документируйте их, в том числе в --help
сообщениях.
Помните , что на POSIX оболочка является подстановкой аргументов ( перед тем запуском программы!), Поэтому не требуют символов (например , *
или $
или ~
) в вариантах , которые должны были бы быть скорлупой маскирования.
В некоторых случаях вы можете встроить интерпретатор, такой как GNU guile или Lua, в свое программное обеспечение (не изобретайте свой собственный язык сценариев, полный Turing, если вы не разбираетесь в языках программирования). Это имеет глубокие последствия для дизайна вашего программного обеспечения (так что об этом следует думать заранее!). После этого вы легко сможете передать некоторый сценарий или выражение этому интерпретатору. Если вы выберете такой интересный подход, тщательно продумайте свое программное обеспечение и его интерпретируемые примитивы; у вас может быть какой-то странный пользователь, кодирующий большие сценарии для вашей вещи.
В других случаях вы можете позволить своим опытным пользователям загружать свои плагины в ваше программное обеспечение (используя методы динамической загрузки à la dlopen
& dlsym
). Опять же, это очень важное проектное решение (поэтому определите и задокументируйте интерфейс плагина с осторожностью), и вам нужно будет определить соглашение для передачи параметров программы этим плагинам.
Если ваша программа сложная вещь, сделайте так, чтобы она принимала некоторые файлы конфигурации (в дополнение или замену аргументов программы) и, возможно, имела какой-то способ проверить (или просто проанализировать) эти файлы конфигурации, не запуская весь код. Например, агент пересылки почты (например, Exim или Postfix) довольно сложен, и полезно иметь возможность «полусухого» его запуска (например, наблюдая, как он обрабатывает некоторый заданный адрес электронной почты без фактической отправки электронной почты).
Обратите внимание, что /option
это Windows или VMS. Это было бы безумием в системах POSIX (потому что файловая иерархия использует /
в качестве разделителя каталогов, а оболочка выполняет глобализацию). Весь мой ответ в основном для Linux (и POSIX).
PS Если возможно, сделайте вашу программу свободным программным обеспечением , вы получите улучшения от некоторых пользователей и разработчиков (и добавление новой опции программы часто является одной из самых простых вещей, которую можно добавить к существующему бесплатному программному обеспечению). Кроме того , ваш вопрос зависит много от предполагаемой аудитории : игра для подростков или браузер для бабушки , вероятно , не нужен такой же вид и количество опций , чем компилятор, или сетевой инспектор для центров обработки данных , сисадминов, или программное обеспечение САПР для микропроцессора архитекторы или для мостовых дизайнеров. Инженеру, знакомому с программированием и сценариями, вероятно, больше нравится иметь много настраиваемых параметров, чем у вашей бабушки, и, возможно, он захочет запустить ваше приложение без X11 (возможно, на crontab
работе).
ls -ltr
чтобы объединить варианты-l
,-t
и-r
. Программы в стиле GNU также обычно допускают варианты на основе слов с двойным дефисом, как--reverse
вместо-r
. Существуют и другие популярные соглашения, такие как-h
показ справки,--
сигнализация об окончании опций, указание-
в качестве имени файла разрешения на чтение из стандартного ввода и т. Д.