Навіщо використовувати чудовий тире (-) для передачі прапорців опціону на тар?


35

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

$ tar -cvf my.tar my_directory/

Але це також працює так:

 $ tar cvf my.tar my_directory/

Тобто без тире (-), що передує варіантам. Чому ти коли-небудь передаєш тире (-) до списку опцій?


Відповіді:


43

Існує кілька різних шаблонів для варіантів, які історично використовувалися в додатках UNIX. Кілька старих, як дьоготь , використовують позиційну схему:

аргументи параметрів команди

як, наприклад, використання смоли

tar * щось * f "файл, що працює на" * "шляхах файлів для маніпулювання" *

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

Деякі інші команди мають більш складний синтаксис командного рядка, наприклад, dd (1), який використовує прапори, рівні знаки, назви шляхів, аргументи та куріпки в груші, всі з диким залишенням.

У BSD та пізніших версіях unix це більш-менш сходилось до однознакових прапорів, позначених символом «-», але це почало створювати декілька проблем:

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

Тоді Сун вирішив, що зайвий '-' є зайвим, і почав використовувати прапори довгих стилів з синглами.

І ось так сталося безладдя зараз.


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. opt (без тире перед набором опцій)
  4. - довга опція (подвійний тире перед назвою опції)

Наприклад:

$ 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
Чи застосовується ця конвенція лише до дьогтю? Що з лс? ls lrt не буде працювати, але ls -lrt / ls -l -r -t буде працювати. Чому так?
Шашанк В’яс

Чотири конвенції повинні працювати для всіх команд.
jonasjacek

2
Ні, вони цього не роблять. Днями я спробував rm rf <namename>, що також не працює.
Шашанк Вяс

-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.