Назад | Перейти на главную страницу

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

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

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

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

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

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