Какая разница между флагами одинарной и двойной черты в командах оболочки?
70
Я новичок в работе с оболочкой, и использование этих команд кажется произвольным. Есть ли причина, по которой один флаг имеет одну черту, а другой может иметь двойную черту?
За одним дефисом могут следовать несколько односимвольных флагов. Двойной дефис префикс одного и того же символа с несколькими символами.
Рассмотрим этот пример:
tar -czf
В этом примере, -czfопределяют три односимвольных флаги: c, zи f.
Теперь рассмотрим другой пример:
tar --exclude
В этом случае --excludeуказывается одна опция, состоящая из нескольких символов exclude. Двойной дефис устраняет неоднозначность аргумента командной строки, гарантируя , что tarинтерпретирует это как , excludeа не сочетание e, x, c, l, u, d, и e.
@kylex, нет, поскольку нет длинной опции с именем просто "c", а - означает длинную опцию, за ней не следует ни одной символьной опции.
psusi
13
Иногда даже длинные команды могут быть пунктирными. Например, 'cdrecord' использует все одноточечные команды (-eject -dao ...). Все зависит от программы, но большинство (!) Из них используют - для одиночных и - для
многосимвольных
8
@mulaz, да, cdrecord делает довольно много глупостей.
@killjoy, потому что, по незнанию или по выбору, авторы этих программ, конечно же, не следовали соглашению. Так же, как cdrecordупомянуто много лет назад в комментариях выше.
psusi
17
Все зависит от программы. Обычно «-» используется для «коротких» параметров (одна буква, -h), а «-» используется для «длинных» (er) параметров (--help).
Короткие параметры обычно можно комбинировать (поэтому "-h -a" совпадает с "-ha")
В Unix-подобных системах ASCII-дефис-минус обычно используется для указания опций. За символом обычно следуют одна или несколько букв. Аргумент, который представляет собой один дефис-минус сам по себе без букв, обычно указывает, что программа должна обрабатывать данные, поступающие со стандартного ввода, или отправлять данные на стандартный вывод. Два дефиса-минус (()) используются в некоторых программах для указания «длинных опций», где используются более описательные имена опций. Это общая черта программного обеспечения GNU.
Это действительно соглашение. Тем не менее, это может помочь парсерам более эффективно узнавать о параметрах, передаваемых программе. Кроме того, существуют полезные утилиты, которые могут помочь при разборе этих команд, например 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.
короткие варианты с одним тире против длинных вариантов с двойным тире
короткие варианты могут быть объединены в один аргумент;
for example: ls -lrt #instead of ls -l -r -t
Если мы разрешаем длинные варианты с одной чертой, это вызывает неоднозначность. Чтобы решить эту проблему, мы используем двойную черту для длинных опций.
Ответы:
За одним дефисом могут следовать несколько односимвольных флагов. Двойной дефис префикс одного и того же символа с несколькими символами.
Рассмотрим этот пример:
В этом примере,
-czf
определяют три односимвольных флаги:c
,z
иf
.Теперь рассмотрим другой пример:
В этом случае
--exclude
указывается одна опция, состоящая из нескольких символовexclude
. Двойной дефис устраняет неоднозначность аргумента командной строки, гарантируя , чтоtar
интерпретирует это как ,exclude
а не сочетаниеe
,x
,c
,l
,u
,d
, иe
.источник
cdrecord
упомянуто много лет назад в комментариях выше.Все зависит от программы. Обычно «-» используется для «коротких» параметров (одна буква, -h), а «-» используется для «длинных» (er) параметров (--help).
Короткие параметры обычно можно комбинировать (поэтому "-h -a" совпадает с "-ha")
источник
источник
Это действительно соглашение. Тем не менее, это может помочь парсерам более эффективно узнавать о параметрах, передаваемых программе. Кроме того, существуют полезные утилиты, которые могут помочь при разборе этих команд, например
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
.источник
короткие варианты могут быть объединены в один аргумент;
Если мы разрешаем длинные варианты с одной чертой, это вызывает неоднозначность. Чтобы решить эту проблему, мы используем двойную черту для длинных опций.
источник