Cytat z Raymondem przez @jasonwryan ma kilka przydatnych informacji, ale zaczyna się w środku tej historii:
- Należy pamiętać, że Unix zaczynał jako wersja Multics o zmniejszonym zakresie i że w całej jego historii funkcje w Uniksie były często imitacjami lub adaptacjami funkcji widzialnych i używanych w innych systemach.
- Znak
'-'
opcji został użyty w Multics. Bitsavers ma instrukcję obsługi poleceń użytkownika .
- Inne systemy używały różnych znaków, niektóre z nich twierdzą, że są bardziej wydajne przy naciskaniu klawiszy (takie jak
'/'
używane w TOPS i VMS), a niektóre mniej (takie jak '('
używane w VM / SP CMS).
- Multics opcje były wieloznakowych, np odzielonych podkreślenia.
- Dłuższe opcje Multics często miały krótszą, skróconą formę, na przykład
-print
vs -pr
(strona 3-8).
- Opcje uniksowe były jednoznakowe i po kilku latach
getopt
zostały wprowadzone. Ponieważ nie był on częścią oryginalnego Uniksa, istnieją narzędzia, które nie były używane getopt
i pozostały bez zmian . getopt
Pomagając jednak w zapewnieniu spójności programów.
Z drugiej strony, używane opcje uniksowe getopt
były jednoznakowe. Inne systemy, w szczególności wszystkie większe, używały słów kluczowych. Niektóre (nie wszystkie) pozwoliły na skrócenie tych słów kluczowych , tj. Nie wszystkie podane znaki, o ile opcja była jednoznaczna. W tym teście występują niejednoznaczności. Na przykład:
- na początku 1985 roku pracowałem nad programem, który musiał zostać przeniesiony do PrimOS . Programiści Prime rywalizowali z kilkoma innymi firmami, oferując język poleceń, który (próbował) naśladować każde z nich, zapewniając najczęściej używane polecenia z każdego z nich. Oczywiście obsługiwali skróty (podobnie jak VMS). Po przeczytaniu pomocy online pisałem
sta
, myśląc o otrzymaniu status
. To był skrót start
, a ponieważ nie dając nic do rozpoczęcia , interpreter poleceń mnie wylogował.
- X Toolkit (używany przez xterm ) pozwala na skrócenie opcji. Aby efektywnie wykorzystać to w Xterm, musi wstępnie przetworzyć parametry polecenia, aby preferowały
-v
(dla wersji) zamiast -vb
(dzwonek wizualny). Zestaw narzędzi X nie ma bezpośredniego sposobu na określenie preferowanej opcji w przypadku niejasności.
Ze względu na ten potencjał niejednoznaczności niektórzy programiści wolą nie dopuszczać skrótów. Na przykład Lynx używa opcji wieloznakowych, nie dopuszczając skrótów.
Nie wszystkie używane programy getopt
: tar
i ps
nie. Nie zrobił rcs
(lub sccs
), jak widać, zaznaczając gdzie myślnik był opcjonalny, a wartości opcji były opcjonalne.
Biorąc to wszystko pod uwagę, programiści GNU dostosowali opcje słów kluczowych używanych w innych systemach, rozszerzając je, getopt
aby zapewnić długą wersję każdej krótkiej opcji. Na przykład, dziennik zmian textutils 1.0 mówi
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.
Zmiana w fileutils była wcześniejsza:
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.
i ktoś może znaleźć jeszcze wcześniej, ale wygląda na to, że nagłówek pliku pokazuje najwcześniejszą datę:
/* Getopt for GNU.
Copyright (C) 1987, 1989 Free Software Foundation, Inc.
który jest (na przykład) współbieżny z X Toolkit (1987). Większość narzędzi uniksowych, które znasz (np. ls
, ps
) Używała istniejących opcji jednoznakowych, które wymagają okresowych wizyt w podręczniku. Wprowadzając getopt_long
, programiści GNU nie zrobili tego, najpierw dodając nowe opcje; oni zaczęli przez tabulacja istniejące możliwości i zapewniając dopasowanie długiej opcji.
Ponieważ dodawali do istniejącego repertuaru, ponownie pojawił się problem konfliktu z istniejącymi opcjami. Aby tego uniknąć, zmienili składnię, używając dwóch myślników przed długimi opcjami.
Te programy nadal używają getopt_long
w ten sposób ze zwykłych powodów:
- skrypty zależą od opcji; programiści nie chcą łamać skryptów
- istnieje pisemny standard kodowania (który może być skuteczny)
- nikt nie wymyślił konkurencyjnego zestawu narzędzi, który jest wyraźnie niezgodny (zarówno twórcy BSD, jak i GNU kopiują od siebie nazwy opcji)
-
jest technicznie nazywana łącznikiem . Używamy słowa „myślnik” w odniesieniu do em myślnika (-) w większości przypadków, a czasem en myślnika (-), ale żaden z nich nie jest łącznikiem (-).