61

Мне было интересно, почему некоторые программы требуют, чтобы их параметры командной строки имели две черты впереди, тогда как некоторым (большинству) требуется только одна черта впереди?

Например, большинство программ выглядят так: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

В то время как некоторые программы выглядят так: xmllint --valid toc.xml --noout

В чем причина того, что некоторым требуется две черты вместо одной? Разве не имеет смысла для всех придерживаться одного стандарта (то есть, подойдет только один штрих).

5 ответов5

33

Там нет широко распространенного стандарта. Существует некоторая согласованность, например, в программах GNU, но вы должны проверить документацию каждой программы.

Цитирую Википедию, выделю мой:

В Unix-подобных системах ASCII-дефис-минус обычно используется для указания опций.За символом обычно следуют одна или несколько букв. Аргумент, который является единственным дефисом-минусом сам по себе без каких-либо букв, обычно указывает, что программа должна обрабатывать данные, поступающие со стандартного ввода, или отправлять данные на стандартный вывод. Два дефиса-минус (()) используются в некоторых программах для указания "длинных опций", где используются более описательные имена опций. Это общая особенность программного обеспечения GNU.

Обычно дефисы указывают предопределенный аргумент. Я думаю, что он используется, чтобы отличать их, например, от имен файлов или других меток, которые вы можете использовать в качестве аргументов. Это не всегда так (см. Ниже).


Вы часто найдете один и тот же аргумент доступным как короткий, так и длинный вариант, как, например, в ls.

Некоторые программы используют один дефис для односимвольных опций и два дефиса для многосимвольных, но не все (на ум приходит GNU find ). Некоторые программы имеют дополнительные дефисы или пропускают их вообще (на ум приходят tar или BSD ps ).

Иногда длинные параметры (--foo) требуют аргументов, в то время как короткие параметры (-f) не требуют (или, по крайней мере, подразумевают определенный аргумент по умолчанию).

Короткие опции (например, cut -d ' ') могут иметь аргументы, в то время как длинные опции (например, ls --all) не обязательно имеют их.

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

С другой стороны, некоторые программы не могут обрабатывать пробелы между опцией и ее аргументом, а другие - нет.

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

Вы действительно не можете вывести синтаксис аргументов одной программы из синтаксиса другой.


Если вы также рассматриваете Windows, все становится еще хуже: в то время как вызовы командной строки Windows традиционно используют /f (по крайней мере, большую часть времени, одиночные символы) для параметров с : в качестве разделителя между параметрами и их значением (см., Например, здесь) ; кросс-платформенные утилиты широко распространены (например, те, о которых вы упоминаете) и содержат более распространенный синтаксис для аргументов со всеми упомянутыми выше несоответствиями.

16

Просто сделайте ls --help и посмотрите варианты; это должно быть очевидно для вас.

Это никак не связано с параметрами. Многие варианты имеют краткую форму и длинную форму, и многие имеют один, а не другой.

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

Вот выдержка из ls --help (man ls дает эквивалентную информацию). Обратите внимание, что у некоторых есть длинная форма без краткой формы (--author , --block-size), у некоторых есть короткая форма без длинной формы (-c , -f , -g), а у некоторых есть и длинная форма и краткая форма (-A/--almost-all , -b/--escape).

 -a, --all                  do not ignore entries starting with .
 -A, --almost-all           do not list implied . and ..
     --author               with -l, print the author of each file
 -b, --escape               print octal escapes for nongraphic characters
     --block-size=SIZE      use SIZE-byte blocks
 -B, --ignore-backups       do not list implied entries ending with ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'
7

Это соглашение от * nix. Двойной дефис предшествует опциям, когда они написаны полностью, в то время как одиночный дефис предшествует опциям, когда они написаны в краткой форме. Например, ls --all --l , можно сократить до ls -al . Как видно, не все варианты имеют свои однобуквенные эквиваленты, хотя обычно используются более часто используемые варианты.

То, принимает ли параметр аргумент, на самом деле не имеет значения - он может принимать или не принимать их, независимо от способа ввода параметра.

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

3

это обычные синтаксисы UNIX,

программный аргумент принимает один дефис ("-"), за которым следует одна буква, когда это простая опция (например, -v ), и два дефиса ("-"), когда опция принимает аргументы (например: --file toc.xml или --file = toc.xml )

не влияет на функциональность программы.

3

одиночная черта реализована getopt и является стандартной функцией posix, двойная черта в getopt_long является стандартом gnu.

Традиционно, одна черта предоставляет одну символьную опцию, подобную этой:

-A или -V и т.д., Но не должны ограничиваться этим. Например, -Wall для gcc включает все предупреждения компилятора для команды компилятора gcc.

Аргументы с двойной чертой имеют тенденцию быть более многословными и часто принимают предоставленный параметр, например --max-count = NUM. Однако --version не имеет себе равных.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .