В чем разница между - (один дефис) и - (два дефиса) в команде? [дубликат]

Оба кажутся флагами, но в чем разница?

14
задан 30 August 2016 в 02:32

4 ответа

  • -- долгая версия
  • - имени, версия

краткого названия, Взглянули на 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 дефисом.

<час>

В отношении кодирования существует что-то для замечания также:

  • Bash getopts не поддерживает длинные имена.
  • getopt от GNU utils делает.
25
ответ дан 23 November 2019 в 02:53

Это на самом деле зависит от затронутой программы. Существуют стандарты, но они не на самом деле , осуществил где угодно: это до каждой программы для реализации их.

Эти 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.

6
ответ дан 23 November 2019 в 02:53

Обычно:

  • - средства считать аргумент/содержание от 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 взят в качестве имени файла.

22
ответ дан 23 November 2019 в 02:53

Один дефис является способом, которым опции к команде традиционно были даны командам 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 (только команда, которую необходимо использовать, если имя файла запускается с дефиса... ;-)

3
ответ дан 23 November 2019 в 02:53

Другие вопросы по тегам:

Похожие вопросы: