Цитата из Raymond по @jasonwryan имеет некоторую полезную информацию, но начинается в середине истории:
- Имейте в виду, что Unix начинался как версия Multics с ограниченной областью действия, и что на протяжении всей своей истории функции Unix часто были имитацией или адаптацией функций, замеченных и используемых в других системах.
'-'
Вариант символ был использован в Multics. Bitsavers имеет руководство для своих пользовательских команд .
- В других системах использовались разные символы, некоторые с большей заявленностью более эффективны при нажатии клавиш (например,
'/'
используемые для TOPS и VMS), а некоторые - менее (например, '('
используемые в CMS VM / SP).
- MULTICS варианты были несколько символов, например, ключевые слова разделены подчеркиванием.
- Более длинные варианты Multics часто имеют более короткую сокращенную форму, например,
-print
vs -pr
(стр. 3-8).
- Варианты Unix были односимвольными и через несколько лет
getopt
были введены. Поскольку он не был частью оригинального Unix, есть утилиты, которые не использовались getopt
и были оставлены как есть. Но getopt
помогая сделать программы последовательными.
С другой стороны, используемые опции Unix getopt
были односимвольными. Другие системы, в частности все более крупные, использовали ключевые слова. Некоторые (не все) допускают сокращение этих ключевых слов , т. Е. Не все символы предоставляются, если параметр был однозначным. В этом тесте на неоднозначность есть подводные камни. Например:
- В начале 1985 года я работал над программой, которую нужно было перенести в PrimOS . Разработчики Prime конкурировали с несколькими другими компаниями, предлагая командный язык, который (пытался) имитировать каждый из этих других, предоставляя наиболее часто используемые команды от каждого. Конечно, они поддержали сокращения (как и VMS). Прочитав онлайн-справку, я набрал
sta
, подумав получить status
. Это была аббревиатура start
, и, не дав ничего начать , интерпретатор команд отключил меня.
- Набор инструментов X (используемый 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.
Изменение в fileutils было ранее:
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 копируют названия опций друг у друга)
-
технически называется дефисом . Мы используем слово «тире» в большинстве случаев для обозначения тире (-), а иногда и тире (-), но ни один из них не является дефисом (-).