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)
linux
windows
command-line
unix
Pacerier
źródło
źródło
-i
Vs.--input
lub-n
--dry-run
.-dtd
tak naprawdę powinno być--dtd
? Skutecznie co zastanawiałem się o to, co robi kreskę (i podwójną kreskę) próbuje oznaczać?--long-options
akceptują również każdy unikalny skrót. Tak więc, dla programu z opcjami--file-in
i--file-out
możesz użyć--file-o=foo
lub--file-i=foo
, który może zaoszczędzić trochę pisania--very-long-optional-parameters
.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 ,-g
lub-geom
za-geometry
). Zobacz inne przykłady w X (7) .Odpowiedzi:
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 ls
daje 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
).źródło
ls --help
Windows?ls
w systemie Windows. Odpowiednikiem byłobydir /?
. Używasz oprogramowania wieloplatformowego, które narusza zwykłe konwencje systemu Windows, zobacz moją odpowiedź.ls --help
fragmencie są długie opcje bez krótkich opcji . Zobacz--author
i--block-size
.ls
polecenie, jest GIT . Powłoka bash GIT lub okno CMD z binem GIT w ścieżce będzie miałols
.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:
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 (
find
przychodzi na myśl GNU ). Niektóre programy mają opcjonalne łączniki lub całkowicie je pomijają (tar
lubps
przychodzi 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.źródło
tar
,ps
,find
i 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żeman <command>
lubinfo <command>
find
któ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.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 --l
można skrócić dols -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.
źródło
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
--noout
(w powyższym pytaniu) naprawdę powinno być napisane,-noout
ponieważ nie ma argumentów ?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.
źródło