Одиночні тире "-` для однозначних параметрів, а подвійні тире" - "для слів?


51

Звідки взялася умова використання одинарних тирев для букв та подвійних тире для слів і чому продовжує застосовуватися?

Наприклад, якщо я набираю текст ls --help, ви бачите:

  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
...

Я намагався гуглити - and -- conventionнавіть з цитатами з невеликим успіхом.


6
Тут просто вибагливий ніт, але персонаж -технічно називається дефісом . Ми використовуємо слово "тире" для позначення em dash (-) у більшості випадків, а іноді і en dash (-), але жодне з яких не є дефісом (-).
— chharvey

4
Мені це справді дратує, коли відомі програми не дотримуються конвенції:java -version
— Kimberly W

4
@Jamil Так. Я опинився тут цікаво, чому цеfind . -delete
— Кшиштоф Венде,

Ідея цього полягає в тому, щоб ви могли писати такі речі, -abякі активують і те, aі b. Без подвійного тире, -helpбуде активувати h, e, lі pваріанти.
— Аарон Франке

Відповіді:


61

В Мистецтво програмування Unix Eric Steven Raymond описує , як ця практика розвивалася:

У оригінальній традиції Unix параметри командного рядка - це одні літери, яким передує окремий дефіс ... Оригінальний стиль Unix розвивався на повільних телетипах ASR-33, що зробило терміновість добродією; таким чином однолітерні варіанти. Утримування клавіші зсуву вимагало фактичних зусиль; таким чином перевага в нижньому регістрі та використання “-” (а не можливо більш логічне “+”) для включення параметрів.

У стилі GNU використовуються опціональні ключові слова (а не літери ключових слів), яким передують дві дефіси. Він розвинувся роками пізніше, коли в деяких досить складних утилітах GNU почали вичерпуватися однобуквені клавіші опціону ( це являло собою патч для симптому, а не ліки від основного захворювання ). Він залишається популярним, оскільки варіанти GNU легше читати, ніж алфавітний суп старих стилів. 1

[1] http://www.faqs.org/docs/artu/ch10s05.html


Зауважимо, що getopt () вперше був опублікований у 1985 році, але UNOS (найдавніший клон UNIX) опублікував getargs () вже у 1982 році (це було написано у 1980 році), а getargs () підтримує короткі варіанти та параметри одного тире довгі (стиль Multics). UNOS масово використовував варіанти одного тире, і UNOS написали колишні співробітники AT&T. У 1988 році GNU вийшов з двома тиреми довгими тиреми, хоча UNOS перевірив, що варіанти одного тире з довгими тиреми чудово працюють.
— schily

28

Однією з причин продовження використання опцій однієї літери є те, що їх можна з'єднати між собою: ls -ltrце набагато простіше, ніж набрати ls --sort=time --reverse --format=long. Є кілька разів, коли обидва корисні для використання. Щодо пошуку цієї теми, спробуйте "конвенція параметрів командного рядка unix".


1
+1 Дякую, це справді допомагає логіці, що лежить в основі реалізації.
— Ларрі

Оскільки UNIX ls не розуміє ls --sort=time --reverse --format=long, не годиться згадувати цей нестандартний метод.
— schily

6

Цитата з Raymond по @jasonwryan має деяку корисну інформацію, але починається в середині історії:

  • Майте на увазі, що Unix стартував як зменшений обсяг версії Multics, і що протягом всієї історії функції Unix часто були імітаціями чи адаптаціями функцій, які бачили та використовували в інших системах.
  • Символ '-'параметра використовувався в Multics. У Bitsavers є посібник для своїх команд користувача .
  • В інших системах використовуються різні символи, деякі з більшою часткою заявляють про ефективність натискань на клавіші (наприклад, '/'для TOPS та VMS), а деякі менші (наприклад, що '('використовуються у VM / SP CMS).
  • MULTICS варіанти були кілька символів, наприклад, ключові слова розділені підкресленням.
  • Параметри довших мультимедійних файлів часто мали більш коротку, скорочену форму, наприклад -printvs -pr(стор. 3-8).
  • Варіанти Unix були однозначними, і через кілька років getoptбуло введено. Оскільки він не входив до оригінального Unix, є утиліти, які не використовувались getoptта залишалися як є. Але getoptдопомогли зробити послідовні програми.

З іншого боку, використовувані параметри Unix getoptбули однозначними. Інші системи, зокрема всі більші, використовували ключові слова. Деякі (не всі) дозволили скоротити ці ключові слова , тобто не всі символи надані до тих пір, поки параметр був однозначним. У цьому тесті є підводні камені на неоднозначність. Наприклад:

  • На початку 1985 року я працював над програмою, яку довелося перенести в PrimOS . Розробники Prime конкурували з кількома іншими компаніями, пропонуючи мову команд, яка (намагалася) наслідувати кожну з цих інших, надаючи команди, що найчастіше використовуються. Звичайно, вони підтримували абревіатури (як і VMS). Прочитавши Інтернет-допомогу, я набрав sta, думаючи отримати status. Це було абревіатурою для start, і, не даючи нічого для початку , інтерпретатор команд відійшов від мене.
  • X Toolkit (використовується xterm ) дозволяє скоротити параметри. Щоб ефективно використовувати це в xterm, він повинен попередньо обробити параметри команди, щоб віддати перевагу -v(для версії) над -vb(візуальний дзвінок). У X Toolkit немає прямого способу вказати бажаний варіант, коли є двозначність.

Через таку можливість неоднозначності деякі розробники вважають за краще не допускати скорочень. Наприклад, Lynx використовує багатозначні параметри, не допускаючи скорочень.

Не всі програми, що використовуються getopt: tarі psне. Також не було rcs(або sccs), як ви бачите, зазначивши, де тире було необов’язковим, а значення параметра необов’язковими.

Враховуючи все це, розробники GNU адаптували параметри ключових слів, які використовуються в інших системах, розширивши, getoptщоб забезпечити довгу версію кожного короткого варіанту. Наприклад, йде текстовий журнал змін змін textutils 1.0

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

Зміна файлевих програм була раніше:

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

і хтось може знайти його ще раніше, але здається, що в заголовку файлу відображається найдавніша дата:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

що (наприклад) узгоджується з X Toolkit (1987). Більшість утиліт Unix, з якими ви знайомі (наприклад ls, ps), використовували наявні однозначні параметри, які потребують періодичного відвідування посібника. Представляючи getopt_long, розробники GNU цього не робили, спочатку додаючи нові параметри; вони почалися з підрахунку існуючих варіантів та надання довготривалого варіанту.

Оскільки вони додавали до існуючого репертуару, (знову) виникла проблема конфлікту з існуючими варіантами. Щоб цього уникнути, вони змінили синтаксис, використовуючи дві тире перед довгими параметрами.

Ці програми продовжують використовуватись getopt_longіз звичайних причин:

  • сценарії залежать від варіантів; розробники не хочуть ламати сценарії
  • є письмовий стандарт кодування (який може бути ефективним)
  • ніхто не придумав конкуруючий набір інструментів, який явно несумісний (і BSD, і розробники GNU копіюють імена опцій одне з одного)

3

У вікіпедії інтерфейс командного рядка повідомляється:

У системах, схожих на Unix, дефіс ASCII-мінус зазвичай використовується для визначення параметрів. За символом зазвичай супроводжується одна або кілька літер. Аргумент, який є єдиним дефісом-мінусом сам по собі без будь-яких літер, зазвичай вказує, що програма повинна обробляти дані, що надходять зі стандартного вводу, або надсилати дані на стандартний вихід. У деяких програмах два символи дефісу (-) використовуються для вказівки "довгих опцій", де використовуються більш описові назви опцій. Це загальна особливість програмного забезпечення GNU.


Це не відповідає на питання, звідки взялася конвенція та чому вона продовжує застосовуватися.
— chharvey

1

Я здогадуюсь, що потрібні були більш описові варіанти, а також із довшими варіантами, вам не доведеться турбуватися про те, що не вичерпаються варіанти одного символу.

Як тільки ви вирішите, що вам потрібні довгі варіанти, у вас виникне проблема, принаймні, якщо ви плануєте підтримувати і довгі, і короткі варіанти. Я не позитивний, але я вважаю, що відповідь Арджежа є ключовим щодо того, чому - і -. Загальний розпорядок обробки, наприклад. getopt_long (), повинен знати, чи може аргумент одного командного рядка містити кілька варіантів, наприклад. -ltr. Таким чином, процедура обробки повинна мати можливість розмежовувати їх. Якщо я прочитав один тире, -, тоді решта аргументу командного рядка може відповідати декільком параметрам. Якщо я прочитав подвійний тире, -, тоді решта аргументу командного рядка повинна відповідати одному параметру.

Нещодавно я скористався getopt_long () і мені починають подобатися довгі варіанти, оскільки їх легше запам’ятовувати та самостійно документувати. Якщо у мене є дві наступні команди:

./aggregator -f 15

./aggregator - час змивання 15

Я б сказав, що другий варіант, що використовує довгий варіант, є більш зрозумілим.


0

Ймовірно, є кілька причин того, що ці два методи використовуються. Одне, звичайно, традиція. Програмісти та користувачі - це людина, і люди очікують, що справи працюватимуть певним чином. Якщо немає причини змінюватись (і справді, для командного рядка причин для зміни не так багато), тоді не робіть цього.

Якщо говорити, я знаю, що є інструменти, які використовують один дефіс для тривалого вибору або взагалі позбавляються від дефісів. Спочатку ці інструменти можуть бути важкими і, як правило, стирчать як бородавки в інакше об'єднаній системі.

Коли я вивчав різницю між двома (і до того, як це став другою природою), я завжди пам’ятав би, що «короткий» дефіс відповідає варіантам «коротких», тоді як «довгий» (або подвійний) дефіс відповідає «довгому» варіанти. Я не знаю, чи використовували це міркування при розробці стилю подвійних дефісів, але це можливо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.