В чем разница между одной и двумя чертами для параметров командной строки?

65

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

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

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

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

Pacerier
источник
10
> Разве для всех не имеет смысла придерживаться одного стандарта - да. Все ли программисты придерживаются стандартов и поддерживают последовательность? Нет. Многие программисты не могут даже поддерживать согласованность в своих программах :) При этом консенсус будет заключаться в том, чтобы использовать одну черту только для однобуквенных опций и две черты для всего, что на самом деле является словами, например, -iпротив --inputили -n --dry-run.
Slhck
1
@slhck Привет, спасибо за помощь. =) Значит ли это, что на -dtdсамом деле должно было быть --dtd? По сути, мне было интересно узнать, что пытается показать тире (и двойной тире) ?
Pacerier
6
Для бонусных баллов: программы, соответствующие стандартам Gnu, --long-optionsбудут также принимать любые уникальные сокращения. Таким образом, для программы с опциями --file-inи --file-out, вы можете использовать --file-o=fooили --file-i=foo, что может сохранить некоторые набрав для --very-long-optional-parameters.
BRPocock
GNU пришли вместе с их конвенцией с помощью двух черточек для «длинных» вариантов, которые я , случается, предпочитаю, но многие старые утилиты, такие как те , которые в комплекте с системой X Window, а также ImageMagick ( например , convert, mogrify) есть «длинные» варианты, использующие только одну черту. Например: xterm -fn 6x10 -geometry 80x24+30+200. Сокращения поддерживаются, если они различны ( например , -gили -geomдля -geometry). Смотрите X (7) для других примеров.
TheDudeAbides

Ответы:

18

Просто сделайте 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'
barlop
источник
4
Как мы делаем ls --helpна окнах?
Пейсер
1
@Pacerier Нет lsв Windows. Эквивалентная команда будет dir /?. Вы используете кроссплатформенное программное обеспечение, которое нарушает обычные правила Windows, см. Мой ответ.
Даниэль Бек
@Pacerier Он не встроен, но загрузите его третьим лицом, Gnuwin32 вы загрузите его (Google gnuwin32). В gnuwin32 есть несколько пакетов, каждый с командами, скачайте пакет coreutils, который имеет много общих команд.
Бароп
В вашем ls --helpотрывке есть длинные варианты без коротких вариантов . Смотрите --authorи --block-size.
Дан
Чтобы ответить на вопрос в оригинальном комментарии @Pacerier: наиболее распространенный способ, которым современные системы Windows получают lsкоманду, - через GIT . GIT bash shell или окно CMD с GIT bin в PATH будут иметь ls.
Ёзорг
34

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

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

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

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


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

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

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

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

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

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

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

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


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

Даниэль Бек
источник
2
Следует отметить, что стандартные библиотеки GNU обеспечивают функциональность отображения параметров «одна минус одна буква», «две минус несколько букв», поэтому все новые программы GNU и большинство новых бесплатных программ в целом используют эту запись (например, - f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); возвраты , такие как tar, ps, findи такие были их синтаксис командной строки , установленный POSIX , прежде чем этот стандарт был полностью загущенным. В системе Gnu / Linux вполне разумно делать ставку, что, по крайней мере --help, (почти) всегда будет поддерживаться, а также man <command>илиinfo <command>
BRPocock
Стандарт GNU говорит, что у вас не должно быть короткой формы без длинной формы и не должно быть длинной без короткой формы?
Бароп
+1 за самый полный ответ, включая упоминание о GNU, findкоторый не следует «соглашению GNU» для длинных опций (вероятно, по причинам соответствия POSIX, как указывало @BRPocock). Я бы снова +1, если бы мог, за упоминание «переключателей» командной строки DOS / Windows, поскольку вопрос ОП как-то помечен как «окна», и это соглашение следует упомянуть для полноты.
TheDudeAbides
7

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

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

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

ладья
источник
Эй, спасибо за помощь, кстати, есть ли причина, по которой вы вводите unix как * nix?
Pacerier
2
@Pacerier - Unix является торговой маркой. Набирая * nix, я фактически ссылаюсь на все Unix и подобные системы, которые для всех практических целей одинаковы. Но в основном это сила привычки ...
Ладья
2
@Pacerier * nix может относиться к Linux или Unix. Я не совсем уверен в этом, потому что некоторое время назад я смотрел на это, но технически, если я помню, BSD из семейства Unix. Linux технически не является .. и не является FreeBSD. Но поговорка * nix будет включать в себя unix / bsd и все что угодно, например, linux и freebsd.
Барлоп
2
+1 за упоминание о сокращении комбинации команд. это настоящая причина, почему есть два стиля.
Ryan_S
3

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

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

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


источник
3
Кроме того, во многих случаях, когда после одной черты можно выбрать одну букву, вы можете сгруппировать буквы вместе. Например, «ls -al» совпадает с «ls -a -l». Параметры двойной тире не могут быть объединены таким образом. Однобуквенные параметры являются более старым стандартом, но в наши дни многие команды принимают оба типа. Например, "ls --all" - это то же самое, что и "ls -a".
Рэнди Оррисон
3
Собственно, еще одно исправление. Параметр с одной буквой и одной буквой может принимать параметр, но обычно он не связан со знаком равенства. Например, «tail -n 50» показывает последние 50 строк файла, что эквивалентно «tail --lines = 50».
Рэнди Оррисон
Согласно этому соглашению, означает ли это, что --noout(в приведенном выше вопросе) должно было быть написано так, -nooutпоскольку оно не имеет аргументов ?
Pacerier
1
то, что сказано в этом ответе о параметрах, совершенно неверно. Первое предложение очевидно. Последнее предложение очевидно. И абзац в середине, который должен ответить на вопрос, совершенно неверен.
Барлоп
@RandyOrrison, когда в одной букве я никогда не видел знака равенства ... и, чтобы уточнить вашу точку зрения, они часто принимают параметры ... wget -w 10 head -n 3 cut -b 2 И посмотрите на Ping -? !! Нагрузки принимают параметры. Этот ответ ужасен
barlop
3

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

Традиционно, одна черта предоставляет опцию одного символа, например:

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

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

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

Мэтт Н
источник