В наши дни стандарт POSIX, использующий getopt()
(он же getopt(3)
), широко используется в качестве стандартного обозначения, но в первые дни люди экспериментировали. На некоторых машинах команда sort
больше не поддерживает нотацию +
. Тем не менее, различные команды (особенно ar
и tar
) принимают элементы управления без префиксного символа - и dd
(на что ссылается Алок в комментарии) вообще использует другое соглашение.
Соглашение GNU об использовании '--
' для длинных опций (поддерживается getopt_long(3)
) было изменено с использования '+
'. Конечно, программное обеспечение X11 использует одну черту перед многосимвольными параметрами. Итак, все это коллекция исторических реликвий, когда люди экспериментировали с тем, как лучше всего с этим справиться.
POSIX документирует Соглашения о коммунальных услугах , с которыми он работает, за исключением случаев, когда исторический прецедент сильнее.
Какие существуют стили обработки опций?
[В свое время SO 367309 содержал следующий материал в качестве моего ответа. Первоначально его спросили * * * * * * * * * * * * FerranB , но впоследствии он был закрыт и удален.]
Сколько разных типов опций вы узнаете? Я могу думать о
многие, в том числе:
- Однобуквенные опции, начинающиеся с одной черты, сгруппированные при наличии
без аргумента, аргумент может быть прикреплен к варианту письма или в следующем
аргумент (много, много команд Unix; большинство команд POSIX).
- Однобуквенные опции, начинающиеся с одной черты, группировка запрещена,
аргументы должны быть приложены (RCS).
- Однобуквенные опции, начинающиеся с одной черты, группировка запрещена,
аргументы должны быть отдельными (pre-POSIX SCCS, IIRC).
- Многобуквенные опции, начинающиеся с одной черты, аргументы могут быть
присоединен или в следующем аргументе (программы X11; также Java и многие программы в Mac OS X с наследием NeXTSTEP).
- Многобуквенные опции, начинающиеся с одной черты, могут быть сокращены
(Ясный футляр Atria).
- Варианты с несколькими буквами, перед которыми стоит один плюс (устарел).
- Варианты с несколькими буквами, перед которыми стоит двойная черта; аргументы могут следовать за '='
или быть отдельным (утилиты GNU).
- Опции без префикса / суффикса, некоторые имена имеют сокращения или являются
подразумевается, аргументы должны быть отдельными. ( AmigaOS
Shell )
Для опций, принимающих необязательный аргумент, иногда необходимо добавить аргумент (co -p1.3 rcsfile.c
),
иногда он должен следовать за знаком «=». POSIX не поддерживает опционально
аргументы осмысленно (POSIX getopt () разрешает их только для последнего
опция в командной строке).
Все разумные системы опций используют опцию, состоящую из двойной черты
('--
') один означает "конец опций" - следующие аргументы
«неопционные аргументы» (обычно имена файлов; POSIX называет их «операндами»)
даже если они начинаются с
тире. (Я считаю поддержку этой записи обязательной. Имейте в виду, что если перед --
стоит опция, требующая аргумента, --
будет рассматриваться как аргумент опции, а не как маркер «конца опций» .)
Многие, но не все программы принимают одинарную черту в качестве имени файла
стандартный ввод (обычно) или стандартный вывод (иногда). Иногда,
как и в GNU 'tar
', оба могут использоваться в одной командной строке:
... | tar -cf - -F - | ...
Первый сольный тире означает «запись в стандартный вывод»; второе означает «прочитать файл»
имена из stdin '.
Некоторые программы используют другие соглашения, то есть параметры, которым не предшествует
тире. Многие из них относятся к древнейшим временам Unix. Например,
'tar' и 'ar' оба принимают опции без тире, поэтому:
tar cvzf /tmp/somefile.tgz some/directory
Команда dd
использует opt=value
исключительно:
dd if=/some/file of=/another/file bs=16k count=200
Некоторые программы позволяют чередовать параметры и другие аргументы
полностью; компилятор C, make и утилиты GNU работают без
POSIXLY_CORRECT в среде являются примерами. Многие программы ожидают
варианты, предшествующие другим аргументам.
Обратите внимание, что git
и другие команды VCS часто используют гибридную систему:
git commit -m 'This is why it was committed'
В качестве одного из аргументов указывается подкоманда. Часто между командой и подкомандой могут указываться необязательные «глобальные» параметры. Есть примеры этого в POSIX; команда sccs
относится к этой категории; Вы можете утверждать, что некоторые из других команд, которые запускают другие команды, также находятся в этой категории: nice
и xargs
возникают из POSIX; sudo
- это не POSIX пример, как и svn
и cvs
.
У меня нет сильных предпочтений между различными системами. когда
Есть несколько вариантов, а затем отдельные буквы с мнемоническим значением
удобны. GNU поддерживает это, но рекомендует сделать резервную копию с помощью
многобуквенные опции, начинающиеся с двойной черты.
Есть некоторые вещи, против которых я возражаю. Один из худших такой же
Вариант письма используется с различными значениями в зависимости от того, что другое
Вариант букв предшествовал ему. В моей книге это нет-нет, но я знаю
программного обеспечения, где это делается.
Еще одним нежелательным поведением является несогласованность в стиле обработки
аргументы (особенно для одной программы, но также в пределах набора
программы). Либо требовать вложенных аргументов, либо требовать отдельного
аргументы (или разрешить либо), но не имеют некоторые параметры, требующие
приложенный аргумент и другие, требующие отдельного аргумента. И быть
согласен с тем, можно ли использовать «=
» для разделения опции и
аргумент.
Как и во многих, многих (связанных с программным обеспечением) вещах - согласованность - это больше
важнее, чем индивидуальные решения. Используя инструменты, которые автоматизируют
и стандартизация обработки аргументов помогает в согласованности.
Что бы вы ни делали, пожалуйста, прочитайте Параметры командной строки TAOUP и
рассмотрим Стандарты для интерфейсов командной строки . ( Добавлено J F
Себастьян - спасибо; Я согласен. )