Какая разница между флагами одинарной и двойной черты в командах оболочки?

70

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

kylex
источник
Предполагается, что он регулируется стандартом POSIX: iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html
cjc
Эта ссылка теперь 404 @cjc :( Возможно, более надежная ссылка может быть en.wikipedia.org/wiki/POSIX
Бернхард Хофманн
Лучшая ссылка: en.wikipedia.org/wiki/…
Крейг Фишер

Ответы:

110

За одним дефисом могут следовать несколько односимвольных флагов. Двойной дефис префикс одного и того же символа с несколькими символами.

Рассмотрим этот пример:

tar -czf

В этом примере, -czfопределяют три односимвольных флаги: c, zи f.

Теперь рассмотрим другой пример:

tar --exclude

В этом случае --excludeуказывается одна опция, состоящая из нескольких символов exclude. Двойной дефис устраняет неоднозначность аргумента командной строки, гарантируя , что tarинтерпретирует это как , excludeа не сочетание e, x, c, l, u, d, и e.

psusi
источник
1
@kylex, нет, поскольку нет длинной опции с именем просто "c", а - означает длинную опцию, за ней не следует ни одной символьной опции.
psusi
13
Иногда даже длинные команды могут быть пунктирными. Например, 'cdrecord' использует все одноточечные команды (-eject -dao ...). Все зависит от программы, но большинство (!) Из них используют - для одиночных и - для
многосимвольных
8
@mulaz, да, cdrecord делает довольно много глупостей.
Псуси
10
также имейте в виду - само по себе обычно означает конец вариантов. см. здесь для получения дополнительной информации: unix.stackexchange.com/questions/11376/…
Sirex
3
@killjoy, потому что, по незнанию или по выбору, авторы этих программ, конечно же, не следовали соглашению. Так же, как cdrecordупомянуто много лет назад в комментариях выше.
psusi
17

Все зависит от программы. Обычно «-» используется для «коротких» параметров (одна буква, -h), а «-» используется для «длинных» (er) параметров (--help).

Короткие параметры обычно можно комбинировать (поэтому "-h -a" совпадает с "-ha")

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

источник

mulaz
источник
2
Так почему же тогда это java-версия и ant-версия?
killjoy
7

Это действительно соглашение. Тем не менее, это может помочь парсерам более эффективно узнавать о параметрах, передаваемых программе. Кроме того, существуют полезные утилиты, которые могут помочь при разборе этих команд, например getopt(3)или нестандартные, getopt_long(3)чтобы помочь разобрать аргументы программы.

Это хорошо, потому что мы можем объединить несколько коротких опций, как говорят другие ответы tar -xzf myfile.tar.gz.

Если бы был аргумент "lisa" для ls, вероятно, было бы иметь другое значение для типа, ls -lisaчем ls --lisa. Первые являются l, i, sи aпараметры, а не слово.

На самом деле, вы можете написать ls -l -i -s -a, то есть точно так же, как ls -lisa, но это будет зависеть от программы.

Есть также программы, которые не подчиняются этому соглашению. Особенно на мой взгляд, ddи gcc.

ssice
источник
3

короткие варианты с одним тире против длинных вариантов с двойным тире

короткие варианты могут быть объединены в один аргумент;

for example: ls -lrt #instead of ls -l -r -t

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

Premraj
источник