Зачем использовать лишнюю черту (-) для передачи флагов опций в tar?


35

Чтобы создать архивный файл для каталога, в tarкоманду с compress, verboseи fileварианты могут быть напечатаны таким образом:

$ tar -cvf my.tar my_directory/

Но это также работает, чтобы сделать это следующим образом:

 $ tar cvf my.tar my_directory/

То есть без дефиса (-) перед параметрами. Зачем вам когда-нибудь передавать тире (-) в список опций?


Ответы:


43

Существует несколько различных шаблонов параметров, которые исторически использовались в приложениях UNIX. Несколько старых, например tar , используют позиционную схему:

параметры команды аргументы

как например tar использует

tar * кое-что * f "файл оперирует" * "путями файлов для манипулирования" *

В первой попытке избежать путаницы tar и несколько других программ со старым стилем флагов-аргументов позволили разделять флаги тире, но большинство из нас, старых парней, просто игнорировали это.

Некоторые другие команды имеют более сложный синтаксис командной строки, например, dd (1), который использует флаги, знаки равенства, имена путей, аргументы и куропатку в груше, и все это с дикой непринужденностью.

В BSD и более поздних версиях Unix это более или менее сходилось к односимвольным флагам, помеченным '-', но это стало представлять пару проблем:

  • флаги могут быть трудно запомнить
  • иногда вы действительно хотели использовать имя с '-'
  • и особенно с инструментами GNU, стали налагаться ограничения на количество возможных флагов. Так что инструменты GNU добавили в GNU длинные опции, такие как --output.

Затем Sun решила, что лишние '-' являются избыточными, и начала использовать флаги в длинном стиле с одиночными '-s.

И вот как это стало беспорядок это сейчас.


9
"и куропатка на грушевом дереве" Лучше, чем моя сухая попытка. Ты победил.
dmckee

1
хороший исторический контекст.

1
Я заметил, что многие программы X (в том числе, скажем, X от Xorg) используют флаги в длинном стиле с одним -. Это от Солнца?
Mattdm

1
Что означает «куропатка в грушевом дереве»? (Могу ли я получить какую-нибудь полезную и простую для понимания ссылку?)
plhn

1
@plhn Идиома. Традиционная английская рождественская колядка «Двенадцать дней Рождества» перечисляет целую кучу экстравагантных подарков, оканчивающихся на «куропатка в грушевом дереве». Это предлагает длинный экстравагантный список.
Чарли Мартин

8

Вы можете задать параметры tar стандартным способом Unix, tar -c -f foo -v -B file1 file2 file3где вам понадобится тире, чтобы различать параметры и параметры или имена файлов в конце командной строки. Или вы можете соединить все параметры в первом аргументе, и в этом случае дефис не обязателен.

Тогда есть ps, где вы используете тире, если вы используете опции SysV-ish, и не учитываете их, если вы используете опции BSD-ish, просто чтобы сделать вещи более запутанными.

И давайте даже не будем говорить о find.


2

Тире используется для устранения различий между именами параметров параметров и их значениями. Я думаю, это больше стандартное соглашение.


1
Я собирался добавить best-practiceтег, потому что я думал, что это может сводиться к этому.

1
@Milktrader, это сложный вопрос, когда мы говорим о лучших практиках. Следование стандартным соглашениям - действительно лучшая практика, но не ясно, хотите ли вы это делать в своих случаях. Это будет зависеть от вашего сценария. Если вы взламываете какую-то быструю команду в командной оболочке, вы, вероятно, не будете об этом беспокоиться, но если вы пишете библиотеку, важно следовать хорошо установленным соглашениям, потому что вы не контролируете, как эта библиотека будет использоваться. по клиентам. В этом случае вы должны охватить все возможные случаи, и неоднозначность между именами опций и значениями важна.

-1

Существует до четырех соглашений об использовании параметров командной строки Unix:

  1. -o -p -t (тире перед каждым вариантом)
  2. -opt (тире перед набором опций)
  3. Опция (без тире перед набором опций)
  4. --long-option (двойная черта перед названием опции)

Например:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

1
Это соглашение применимо только к tar? Как насчет лс? ls lrt не будет работать, но ls -lrt / ls -l -r -t будет работать. Почему так?
Шашанк Вьяс

Четыре соглашения должны работать для всех команд.
jonasjacek

2
Нет, они не На днях я попробовал rm rf <filename>, это тоже не работает.
Шашанк Вьяс

-2

С ведущим знаком минус / тире (-) вы должны держать параметры в точном порядке. Без минуса порядок вашего варианта может измениться.

Например:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar

Этот ответ наполовину прав, но AFAIK, это только флаги, fкоторые принимают аргумент, порядок которого имеет значение. См. Unix.stackexchange.com/a/239120/3169
Микел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.