Pojedyncze myślniki `-` dla opcji jednoznakowych, ale podwójne myślniki` --` dla słów?


51

Skąd wzięła się konwencja używania pojedynczych myślników dla liter i podwójnych myślników dla słów i dlaczego nadal jest używana?

Na przykład po ls --helpwpisaniu zobaczysz:

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

Próbowałem googlować - and -- conventionnawet z niewielkimi sukcesami.


6
Po prostu wybredna, ale postać -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 (-).
chharvey

4
Naprawdę denerwuje mnie, gdy dobrze znane programy nie są zgodne z konwencją:java -version
Kimberly W

4
@Jamil Tak. Skończyło się tutaj, zastanawiając się, dlaczego tak jestfind . -delete
Krzysztof Wende

Chodzi o to, abyś mógł pisać rzeczy, -abktóre aktywują zarówno ai b. Bez podwójnej deski rozdzielczej, -helpby aktywować h, e, loraz popcje.
Aaron Franke

Odpowiedzi:


61

W The Art of Unix Programming Eric Steven Raymond opisuje rozwój tej praktyki:

W oryginalnej tradycji uniksowej opcje wiersza poleceń to pojedyncze litery poprzedzone pojedynczym łącznikiem ... Oryginalny styl uniksowy ewoluował w powolnych teletypach ASR-33, dzięki czemu zwięzłość stała się cnotą; dlatego opcje jednoliterowe. Przytrzymanie klawisza Shift wymagało faktycznego wysiłku; dlatego preferowane są małe litery i użycie „-” (zamiast być może bardziej logicznego „+”) w celu włączenia opcji.

Styl GNU wykorzystuje słowa kluczowe opcji (zamiast liter słów kluczowych) poprzedzone dwoma łącznikami. Ewoluowało lata później, gdy niektóre z dość skomplikowanych narzędzi GNU zaczęły brakować jednoliterowych klawiszy opcji ( stanowiło to łatkę na objaw, a nie lekarstwo na chorobę podstawową ). Pozostaje popularny, ponieważ opcje GNU są łatwiejsze do odczytania niż zupa alfabetyczna starszych stylów. 1

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


Zauważ, że getopt () został po raz pierwszy opublikowany w 1985 r., Ale UNOS (najstarszy klon UNIX) opublikował getargs () już w 1982 r. (Został napisany w 1980 r.), A getargs () obsługuje krótkie opcje i długie opcje pojedynczego myślnika (styl Multics). UNOS masowo korzystał z opcji długiego pojedynczego kreskowania, a UNOS napisali byli pracownicy AT&T. W 1988 r. GNU wyszedł z opcją długiego kreskowania podwójnego, chociaż UNOS zweryfikował, że opcje długiego kreskowania działają świetnie.
schily

28

Jednym z powodów dalszego korzystania z opcji jednoliterowych jest to, że można je łączyć razem: ls -ltro wiele łatwiej jest pisać niż ls --sort=time --reverse --format=long. Jest wiele razy, gdy oba są dobre w użyciu. Jeśli chodzi o wyszukiwanie w tym temacie, wypróbuj „konwencję opcji wiersza poleceń unix”.


1
+1 Dzięki, to naprawdę pomaga w logice implementacji.
Larry

Ponieważ UNIX ls nie rozumie ls --sort=time --reverse --format=long, nie warto wspominać o tej niestandardowej metodzie.
schily

6

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 -printvs -pr(strona 3-8).
  • Opcje uniksowe były jednoznakowe i po kilku latach getoptzostały wprowadzone. Ponieważ nie był on częścią oryginalnego Uniksa, istnieją narzędzia, które nie były używane getopti pozostały bez zmian . getoptPomagając jednak w zapewnieniu spójności programów.

Z drugiej strony, używane opcje uniksowe getoptbył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: tari psnie. 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, getoptaby 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_longw 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)

3

W Wikipedii Interfejs wiersza poleceń jest zgłaszany:

W systemach uniksopodobnych do określania opcji powszechnie stosuje się łącznik minus ASCII. Po znaku zwykle występuje jedna lub więcej liter. Argument, który jest pojedynczym łącznikiem minus sam w sobie bez liter, zwykle określa, że ​​program powinien obsługiwać dane pochodzące ze standardowego wejścia lub wysyłać dane na standardowe wyjście. W niektórych programach używane są dwa znaki łącznika minus (-), aby określić „długie opcje”, w których używane są bardziej opisowe nazwy opcji. Jest to wspólna cecha oprogramowania GNU.


Nie odpowiada to na pytanie, skąd pochodzi konwencja i dlaczego nadal jest stosowana.
chharvey

1

Domyślam się, że pożądane były bardziej opisowe opcje, a także przy dłuższych opcjach nie będziesz musiał się martwić, że zabraknie opcji pojedynczej postaci.

Gdy zdecydujesz się na długie opcje, masz problem, przynajmniej jeśli planujesz obsługiwać zarówno długie, jak i krótkie opcje. Nie jestem pozytywny, ale wierzę, że odpowiedź arkady ma klucz do tego, dlaczego - i -. Ogólna procedura przetwarzania, np. getopt_long () musiałby wiedzieć, czy pojedynczy argument wiersza poleceń może zawierać wiele opcji, np. -ltr. Zatem procedura przetwarzania musiałaby być w stanie rozróżnić te dwa elementy. Jeśli przeczytam pojedynczy myślnik, -, wówczas reszta argumentu wiersza poleceń może pasować do wielu opcji. Jeśli przeczytam podwójną kreskę, -, wówczas reszta argumentu wiersza poleceń musi pasować do jednej opcji.

Niedawno skorzystałem z getopt_long () i zaczynam lubić długie opcje, ponieważ są łatwiejsze do zapamiętania i samodzielnego dokumentowania. Jeśli mam następujące dwa polecenia:

./aggregator -f 15

./aggregator - czas spłukiwania 15

Powiedziałbym, że drugi z opcją długiej opcji jest bardziej zrozumiały.


0

Prawdopodobnie jest kilka powodów, dla których stosuje się te dwie metody. Jednym z nich jest oczywiście tradycja. Programiści i użytkownicy to ludzie, a ludzie oczekują, że wszystko zadziała w określony sposób. Jeśli nie ma powodu do zmiany (a tak naprawdę dla wiersza poleceń nie ma zbyt wiele powodów do zmiany), to nie rób tego.

Biorąc to pod uwagę, wiem, że istnieją narzędzia, które używają pojedynczego łącznika do długiej opcji, a nawet pozbywają się łączników. Narzędzia te mogą być początkowo trudne i mają tendencję do wystawania jako brodawki w skądinąd zunifikowanym systemie.

Kiedy uczyłem się różnicy między nimi (i zanim stało się to drugą naturą), zawsze pamiętałem, że „krótki” łącznik pasuje do „krótkich” opcji, podczas gdy „długi” (lub podwójny) łącznik pasuje do „długich” opcje Nie wiem, czy takie rozumowanie wykorzystano przy opracowywaniu stylu podwójnego łącznika, ale jest to możliwe.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.