На этот вопрос уже есть ответ здесь:
Оба кажутся флагами, но в чем разница?
--
долгая версия -
имени, версия краткого названия, Взглянули на man ls
и некоторые опции:
-a, --all : do not ignore entries starting with .
-A, --almost-all : do not list implied . and ..
-b, --escape : print C-style escapes for nongraphic characters
-B, --ignore-backups : do not list implied entries ending with ~
Они - то же, но некоторые предпочитают короткое, некоторые долгие версии.
И оба там для совместимости. Удаление опции повреждает программное обеспечение.
<час> Не каждая команда следует за этим это. Как Bakuriu упоминает в комментарии: команда как find
имеет то, что можно рассмотреть "длинными именами" с 1 дефисом.
В отношении кодирования существует что-то для замечания также:
Это на самом деле зависит от затронутой программы. Существуют стандарты, но они не на самом деле , осуществил где угодно: это до каждой программы для реализации их.
Эти find
команда, например, берет параметры полного имени с единственными дефисами:
find . -iname "*.jpg" -delete
Однако в общем, двойные дефисы указывают на переключатель, который является полным словом, и единственные дефисы указывают на переключатель, который является одной буквой. И однобуквенные переключатели могут быть объединены, что означает, что все следующие команды эквивалентны:
cp --verbose --recursive /dir/from /dir/to
cp -v -r /dir/from /dir/to
cp -vr /dir/from /dir/to
А двойной дефис, сопровождаемый пространством, может также использоваться, чтобы указать, что "это - конец команд; все, что следует, является именем файла, даже если оно похоже на команду".
И единственный дефис без следующих букв может указать "на чтение от stdin, не из файла".
Однако все это зависимо от программы . Любая данная программа может нарушить любой из этих стандартов, как замечено, например, с find
.
Обычно:
-
средства считать аргумент/содержание от STDIN (дескриптор файла 0)
--
конец средств опций команды, все следует, которые являются аргументами
Почему необходимый:
О нас -
:
$ echo foobar | cat -
foobar
Хотя cat
может считать содержание из STDIN, не нуждаясь -
, для многих команд нужны это и их man
страницы упоминают это явно.
Теперь о --
, Я создал файл -spam
, позвольте нам cat
файл:
$ echo foobar >-spam
$ cat -spam
cat: invalid option -- 'p'
Try 'cat --help' for more information.
$ cat -- -spam
foobar
Без --
, cat
берет s
, p
, a
, m
все, поскольку это - опции, как они следуют -
, --
явно указывает на конец опции (опций), после этого -spam
взят в качестве имени файла.
Один дефис является способом, которым опции к команде традиционно были даны командам Unix. Им следовала за одним дефисом одна буква (или иногда число) (-a
-i
-T
). Некоторые опции сопровождаются аргументом (-ofilename
-o filename
).
Два дефиса главным образом используются - и являются предпочтенным способом дать опции - для программ/команд в системах GNU - т.е. главным образом в системах Linux. У них есть два дефиса, сопровождаемые одним или несколькими словами, разделенными единственными дефисами (--version
--ignore-case
). Опции с аргументами используют знак "равно" для разделения опции и аргумента (--log-file=filename
)
Недостаток со старыми одной-hypen опциями состоит в том, что нет никакой стандартной буквы, чтобы сделать то же самое по различным командам. Да, -v
часто используется для "подробного" - и -V
иногда используется для "версии" - но между командами нет никакого реального consesnsus. Например, -i
означает "интерактивный" для cp
, mv
, ln
и rm
- команда запросит перед перезаписью или удалит. Но это menans "игнорирует регистр" в grep
. Сделать это еще более трудным, команда sort
использование -f
- для "случая сгиба" - таким же образом, для игнорирования верхнего регистра и нижнего регистра. Сделать беспорядок завершенным, много команд - включая mv
и cp
- использование -f
для "силы"..., что команда должна сделать что-то (как перезапись существующий файл), даже при том, что это обычно не было бы.
Вдобавок ко всему, команды для различных систем Unix (Солярис, *BSD, SysV, AIX...) могут использовать различные буквы, чтобы сделать то же самое. Например, who
списки команд пользователи в системе. Эта команда может дополнительно показать, какие пользователи принимают сообщения от других пользователей к их терминалу - опция для этого -w
в соответствии с Linux, в то время как Солярис использует -T
.
Долгие опции, с другой стороны, позволяет той же опции использоваться на всех командах, и они на самом деле описывают то, что опции делает. Например, --ignore-case
, --interactive
, --version
, --force
. Таким образом --ignore-case
используется в обоих grep
и sort
.
Но снова, они почти только используются в командах/программах, сделанных как часть проекта GNU...
Наконец двойной дефис используется, чтобы сказать команде, что список опций закончен, и что, что следует, аргументы - неважно, насколько они могут быть похожими на опции. Если имя файла запускается с дефиса (например. -this_is_a_bad_filename
), команды могут перепутать его с опцией и попыткой проанализировать его - двойной дефис предотвращает это. mv -vi -- -this_is_a_bad_filename this_is_a_better_filename
(только команда, которую необходимо использовать, если имя файла запускается с дефиса... ;-)