Я новичок в работе с оболочкой, и использование этих команд кажется произвольным. Есть ли причина, по которой у одного флага одно тире, а у другого - двойное?
За одним дефисом может следовать несколько односимвольных флагов. Двойной дефис ставит префикс односимвольного варианта с несколькими символами.
Рассмотрим этот пример:
tar -czf
В этом примере -czf
указывает три односимвольных флага: c
, z
, и f
.
А теперь рассмотрим другой пример:
tar --exclude
В таком случае, --exclude
задает одиночный, многосимвольный параметр с именем exclude
. Двойной дефис устраняет неоднозначность аргумента командной строки, гарантируя, что tar
интерпретирует это как exclude
а не сочетание e
, x
, c
, l
, u
, d
, и e
.
Все зависит от программы. Обычно «-» используется для «коротких» параметров (однобуквенные, -h), а «-» используется для «длинных» (er) параметров (--help).
Короткие параметры обычно можно комбинировать (поэтому "-h -a" аналогично "-ha")
В Unix-подобных системах дефис ASCII – минус обычно используется для указания параметров. За символом обычно следует одна или несколько букв. Аргумент, который представляет собой один дефис - минус сам по себе без каких-либо букв, обычно указывает, что программа должна обрабатывать данные, поступающие со стандартного ввода, или отправлять данные на стандартный вывод. Два символа дефиса – минус (-) используются в некоторых программах для указания «длинных параметров», в которых используются более информативные имена параметров. Это обычная особенность программного обеспечения GNU.
Это действительно конвенция. Однако это может помочь синтаксическим анализаторам более эффективно узнать о параметрах, переданных программе. Кроме того, есть полезные утилиты, которые могут помочь в синтаксическом анализе этих команд, например getopt(3)
или нестандартный getopt_long(3)
чтобы помочь разобрать аргументы программы.
Это хорошо, потому что мы можем объединить несколько коротких вариантов, как говорят другие ответы, например tar -xzf myfile.tar.gz
.
Если бы был аргумент "Лиза" в пользу 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
Если мы разрешаем длинные варианты с одним тире, это вызывает двусмысленность. Чтобы решить эту проблему, мы используем двойное тире для длинных вариантов.