Цитата з Raymond по @jasonwryan має деяку корисну інформацію, але починається в середині історії:
- Майте на увазі, що Unix стартував як зменшений обсяг версії Multics, і що протягом всієї історії функції Unix часто були імітаціями чи адаптаціями функцій, які бачили та використовували в інших системах.
- Символ
'-'
параметра використовувався в Multics. У Bitsavers є посібник для своїх команд користувача .
- В інших системах використовуються різні символи, деякі з більшою часткою заявляють про ефективність натискань на клавіші (наприклад,
'/'
для TOPS та VMS), а деякі менші (наприклад, що '('
використовуються у VM / SP CMS).
- MULTICS варіанти були кілька символів, наприклад, ключові слова розділені підкресленням.
- Параметри довших мультимедійних файлів часто мали більш коротку, скорочену форму, наприклад
-print
vs -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 копіюють імена опцій одне з одного)
-
технічно називається дефісом . Ми використовуємо слово "тире" для позначення em dash (-) у більшості випадків, а іноді і en dash (-), але жодне з яких не є дефісом (-).