Jaka jest różnica między jednym myślnikiem a dwoma myślnikami dla parametrów wiersza polecenia?

65

Zastanawiałem się, dlaczego niektóre programy wymagają, aby parametry wiersza polecenia zawierały dwa myślniki z przodu, a niektóre (większość) wymagają tylko jednego myślnika z przodu?

Na przykład większość programów wygląda następująco: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Podczas gdy niektóre programy wyglądają tak: xmllint --valid toc.xml --noout

Jaki jest powód, dla którego niektóre wymagają dwóch myślników zamiast jednego? Czy nie ma sensu, aby wszyscy trzymali się jednego standardu (tzn. Wystarczy jedna kreska)

Pacerier
źródło
10
> Czy nie ma sensu trzymać się jednego standardu - tak. Czy wszyscy programiści przestrzegają standardów i zachowują spójność? Nie. Wielu programistów nie jest nawet w stanie zachować spójności w swoich programach :) Biorąc to pod uwagę, konsensus polegałby na użyciu jednego myślnika tylko dla opcji z literami i dwóch myślników dla wszystkich słów, np. -iVs. --inputlub -n --dry-run.
slhck
1
@slhck Hej dzięki za pomoc =) Czy zgodnie z tą konwencją to znaczy, że -dtdtak naprawdę powinno być --dtd? Skutecznie co zastanawiałem się o to, co robi kreskę (i podwójną kreskę) próbuje oznaczać?
Pacerier
6
W przypadku punktów bonusowych: programy zgodne ze standardami Gnu dla --long-optionsakceptują również każdy unikalny skrót. Tak więc, dla programu z opcjami --file-ini --file-outmożesz użyć --file-o=foolub --file-i=foo, który może zaoszczędzić trochę pisania --very-long-optional-parameters.
BRPocock,
GNU przyszedł wraz z ich konwencji pomocą dwóch kresek na „long” opcji, które zdarza mi się wolą, ale wiele starszych mediów, takich jak te w zestawie z X Window System, jak również ImageMagick ( np , convert, mogrify) mają „długi” opcje przy użyciu tylko jednego myślnika. Na przykład: xterm -fn 6x10 -geometry 80x24+30+200. Skróty są obsługiwane pod warunkiem, że są odrębne ( np , -glub -geomza -geometry). Zobacz inne przykłady w X (7) .
TheDudeAbides

Odpowiedzi:

18

Po prostu zrób ls --help i spójrz na opcje; powinno to być dla ciebie oczywiste.

W ogóle nie ma to nic wspólnego z parametrami. Wiele opcji ma krótką i długą formę, a wiele ma jedną, a nie drugą.

A także, jeśli chodzi o parametry, to po prostu, że w długiej formie, gdy przyjmą parametr, wygląda na to, że zawsze jest równy. Ale oczywiście krótkie mogą przyjmować parametry tak samo; po prostu nie używają równych.

Oto wyciąg z ls --help( man lsdaje równoważne informacje). Zauważ, jak niektórzy mają długą formę bez krótkiego formularza ( --author, --block-size), niektóre mają krótki formularz bez długiej formie ( -c, -f, -g), a niektóre mają zarówno długi formularz i krótki formularz ( -A/ --almost-all, -b/ --escape).

 -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 ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'
barlop
źródło
4
Jak robimy w systemie ls --helpWindows?
Pacerier
1
@Pacerier Nie ma lsw systemie Windows. Odpowiednikiem byłoby dir /?. Używasz oprogramowania wieloplatformowego, które narusza zwykłe konwencje systemu Windows, zobacz moją odpowiedź.
Daniel Beck
@Pacerier Nie jest wbudowany, ale pobierz go innej firmy, Gnuwin32 możesz pobrać (google gnuwin32). W gnuwin32 jest kilka pakietów z poleceniami, pobierz pakiet coreutils, który ma wiele wspólnych poleceń.
barlop
W twoim ls --helpfragmencie są długie opcje bez krótkich opcji . Zobacz --authori --block-size.
Dan
Aby odpowiedzieć na pytanie w oryginalnym komentarzu @ Pacerier: Najczęstszym sposobem, w jaki nowoczesne systemy Windows otrzymują lspolecenie, jest GIT . Powłoka bash GIT lub okno CMD z binem GIT w ścieżce będzie miało ls.
yzorg
34

Nie ma powszechnego standardu. Istnieje pewna spójność, np. W programach GNU, ale musisz sprawdzić dokumentację każdego programu.

Cytując Wikipedię , moje podkreślenie:

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 (-) w celu określenia „długich opcji”, w których używane są bardziej opisowe nazwy opcji . Jest to wspólna cecha oprogramowania GNU.

Zazwyczaj łączniki wskazują predefiniowany argument. Myślę, że służy do odróżnienia ich od np. Nazw plików lub innych etykiet, których możesz użyć jako argumentów. Jednak nie zawsze tak jest (patrz poniżej).


Często ten sam argument jest dostępny zarówno jako opcja krótka, jak i długa, jak np. W ls .

Niektóre programy używają jednego łącznika dla opcji jednoznakowych i dwóch łączników dla opcji wieloznakowych, ale nie wszystkie ( findprzychodzi na myśl GNU ). Niektóre programy mają opcjonalne łączniki lub całkowicie je pomijają ( tarlub psprzychodzi na myśl BSD ).

Czasami długie opcje ( --foo) wymagają argumentów, podczas gdy krótkie opcje ( -f) nie (lub przynajmniej sugerują określony domyślny argument).

Krótkie opcje (np. cut -d ' ') Mogą mieć argumenty, podczas gdy długie opcje (np. ls --all) Niekoniecznie je mają.

Aby ustawić określone zachowanie programu, czasami trzeba użyć krótkiej opcji, dla innych trzeba użyć długiej opcji, a dla niektórych masz wybór.

W pokrewnej uwadze niektóre programy nie potrafią obsłużyć spacji między opcją a jej argumentem , podczas gdy inne nie.

Jak napisałem na początku, po prostu nie ma wspólnego zachowania ani standardu. Często można prześledzić podobne zachowanie do tej samej biblioteki używanej do analizy argumentów, ale prawdopodobnie nie chcesz czytać źródeł, aby się tego dowiedzieć.

Naprawdę nie można wywnioskować składni argumentów jednego programu z innej.


Jeśli weźmiesz również pod uwagę Windows, staje się jeszcze gorzej: podczas gdy wywołania wiersza poleceń Windows tradycyjnie używają /f(przynajmniej przez większość czasu, pojedynczych znaków) dla opcji, :jako separator między opcjami a ich wartością (patrz np. Tutaj ); narzędzia wieloplatformowe są szeroko rozpowszechnione (takie jak te, o których wspominasz) i przynoszą bardziej powszechną składnię łączników dla argumentów, ze wszystkimi niespójnościami wymienionymi powyżej.

Daniel Beck
źródło
2
Należy zauważyć, że standardowe biblioteki GNU zapewniają funkcjonalność mapowania opcji jeden minus jeden list, dwa minus minus wiele liter, więc wszystkie nowe programy GNU i większość nowego wolnego oprogramowania ogólnie używa tej notacji (np. f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); osobnikami, takie jak tar, ps, findi takie miały swoje polecenia linii składni wyznaczonym przez POSIX zanim norma została całkowicie zżelowane. W systemie Gnu / Linux jest to dość bezpieczny zakład, który przynajmniej --help(prawie) zawsze będzie obsługiwany, a także man <command>lubinfo <command>
BRPocock
czy standard GNU mówi, że nie powinieneś mieć krótkiej formy bez długiej formy i nie powinieneś mieć długiej formy bez krótkiej formy?
barlop
+1 za najbardziej kompletną odpowiedź, w tym wzmiankę o GNU, findktóry nie przestrzega „konwencji GNU” dla długich opcji (prawdopodobnie z powodów zgodności z POSIX, jak wskazał @BRPocock). Zrobiłbym jeszcze raz +1, gdybym mógł, za wzmiankę o „przełącznikach” w wierszu poleceń DOS / Windows, ponieważ pytanie OP zostało jakoś oznaczone jako „windows”, a konwencję należy wspomnieć o kompletności.
TheDudeAbides
7

Jest to konwencja pochodząca od * nix. Podwójny łącznik poprzedza opcje, gdy są napisane w całości , a pojedynczy łącznik poprzedza opcje, gdy są napisane w krótkiej formie . Na przykład ls --all --lmożna skrócić do ls -al. Jak widać, nie wszystkie opcje mają swoje odpowiedniki jednoliterowe, chociaż zwykle używane są częściej używane.

To, czy opcja przyjmuje argument, tak naprawdę nie robi różnicy - może je wziąć lub nie, niezależnie od sposobu wprowadzenia opcji.

Pisząc je jednorazowo, nie ma to większego znaczenia, ale przy pisaniu poleceń, na przykład w plikach .alias, zwykle używa się pełnej formy. Wyłącznie dla ułatwienia czytania dla następnej osoby.

Wieża
źródło
Hej, dzięki za pomoc. Btw. Czy istnieje powód, dla którego wpisujesz Unix jako * nix?
Pacerier
2
@Pacerier - Unix to nazwa handlowa. Wpisując * nix, faktycznie odnoszę się do wszystkich systemów uniksowych i podobnych, które dla wszystkich praktycznych celów są takie same. Ale przede wszystkim jest to siła nawyku ...
Wież
2
@Pacerier * nix może odnosić się do systemu Linux lub Unix. Nie jestem do końca pewien, czy to już dawno temu przyjrzałem się temu, ale technicznie, o ile pamiętam, BSD pochodzi z rodziny Unix. Linux technicznie nie jest… i nie jest też FreeBSD. Ale powiedzenie * nix obejmowałoby unix / bsd i cokolwiek podobnego, np. Linux i freebsd.
barlop
2
+1 za wzmiankę o łączeniu skrótów poleceń. to jest prawdziwy powód, dla którego istnieją dwa style.
Ryan_S,
3

są to konwencjonalne składnie UNIX,

argument programu przyjmuje jeden myślnik („-”), a następnie pojedynczą literę, gdy jest to prosta opcja (np .: -v ), i dwa myślnik („-”), gdy opcja przyjmuje argumenty (np .: - plik toc.xml lub --file = toc.xml )

bez wpływu na funkcjonalność programu.


źródło
3
Ponadto w wielu przypadkach z opcjami pojedynczej litery po jednym myślniku możesz pogrupować litery. Na przykład „ls -al” jest taki sam jak „ls -a -l”. W ten sposób nie można łączyć opcji podwójnego myślnika. Opcje jednoliterowe są starszym standardem, ale obecnie wiele poleceń przyjmuje oba typy. Np. „Ls --all” jest taki sam jak „ls -a”.
Randy Orrison,
3
Właściwie kolejna korekta. Opcje pojedynczej litery z pojedynczym myślnikiem mogą przyjmować parametr, ale zwykle nie jest on powiązany ze znakiem równości. Na przykład „tail -n 50” pokazuje ostatnie 50 wierszy pliku, co odpowiada „tail --lines = 50”.
Randy Orrison,
Czy przez tę konwencję oznacza to, że --noout(w powyższym pytaniu) naprawdę powinno być napisane, -nooutponieważ nie ma argumentów ?
Pacerier
1
co jest powiedziane w tej odpowiedzi na temat parametrów jest całkowicie błędne. Pierwsze zdanie jest oczywiste. Ostatnie zdanie jest oczywiste. A akapit w środku, który powinien odpowiedzieć na pytanie, jest całkowicie błędny.
barlop
@RandyOrrison, gdy pojedyncza litera nigdy nie widziałem znaku równości .. i dla rozwinięcia twojego punktu, często przyjmują parametry .. wget -w 10 head -n 3 cut -b 2 I spójrz na Ping -? !! Obciążenia przyjmują parametry. Ta odpowiedź jest okropna
barlop
3

single dash jest implementowany przez getopt i jest standardową funkcją posix, podwójne dash w getopt_long i jest standardem GNU .

Tradycyjnie pojedyncza kreska zapewnia opcję jednej postaci, taką jak ta:

-A lub -V itp., Ale nie musi się do tego ograniczać. np. -Wall dla gcc włącza wszystkie ostrzeżenia kompilatora dla polecenia kompilatora gcc.

Argumenty podwójnego myślnika są bardziej szczegółowe i często przyjmują podany parametr, taki jak --max-count = NUM. Jednak --version nie ma sobie równych.

Ogólnie rzecz biorąc, nie ma żadnych reguł ani zdefiniowanych standardów dotyczących argumentów programu, tylko garść tradycji. Jeśli jednak używane są funkcje analizujące wiersza polecenia getopt i getopt_long, parametry powinny zasadniczo być zgodne ze standardem, ponieważ funkcje biblioteczne wymuszają określony sposób wykonania tej czynności.

Matt H.
źródło