Was ist der Unterschied zwischen einem Bindestrich und zwei Bindestrichen für Eingabeaufforderungsparameter?

65

Ich habe mich gefragt, warum bei einigen Programmen die Eingabeaufforderungsparameter zwei Bindestriche voraussetzen, während bei einigen (den meisten) nur ein Bindestrich vorausgesetzt wird.

Zum Beispiel sehen die meisten Programme so aus: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Während einige Programme so aussehen: xmllint --valid toc.xml --noout

Was ist der Grund, warum manche zwei Striche anstelle von einem benötigen? Ist es nicht sinnvoll, dass sich alle an einen Standard halten (dh ein einziger Strich reicht aus)?

Pacerier
quelle
10
> Ist es nicht sinnvoll, dass sich alle an einen Standard halten - ja. Halten sich alle Programmierer an Standards und halten sie die Konsistenz aufrecht? Nein. Viele Programmierer können nicht einmal die Konsistenz in ihren Programmen aufrechterhalten :) Abgesehen davon würde der Konsens darin bestehen, nur einen Gedankenstrich für Ein-Buchstaben-Optionen und zwei Gedankenstriche für alle Wörter zu verwenden, z . B. -ivs. --inputoder -n --dry-run.
Slhck
1
@slhck Heys danke für die Hilfe =) Nach dieser Konvention heißt das dann, dass das -dtdeigentlich hätte sein sollen --dtd? Effektiv , was ich frage mich , ist es, was den Strich tut (und Doppel-Bindestrich) versucht zu bedeuten?
Pacerier
6
Bonuspunkte: Programme, die den Gnu-Standards für entsprechen --long-options, akzeptieren auch eindeutige Abkürzungen. Also, für ein Programm mit Optionen --file-inund --file-out, könnten Sie --file-o=foooder verwenden --file-i=foo, was Tipparbeit ersparen kann --very-long-optional-parameters.
BRPocock
GNU kam mit ihrer Konvention der Verwendung von zwei Strichen für „long“ Optionen zusammen, die ich lieber passieren, aber viele älteren Dienstprogramme, wie sie mit dem X - Window - System gebündelt sowie ImageMagick ( zB , convert, mogrify) hat „long“ Optionen mit nur einem Strich. Zum Beispiel: xterm -fn 6x10 -geometry 80x24+30+200. Abkürzungen werden unterstützt, sofern sie sind verschieden ( zB , -goder -geomfür -geometry). Siehe X (7) für andere Beispiele.
TheDudeAbides

Antworten:

18

Genau das tun , ls --help und auf den Optionen aussehen; es sollte dir klar sein.

Es hat überhaupt nichts mit Parametern zu tun. Viele Optionen haben eine kurze und eine lange Form, und viele haben eine und keine andere.

Und in Bezug auf Parameter ist es einfach so, dass es in der langen Form, wenn sie einen Parameter nehmen, so aussieht, als ob es immer mit einem Gleichen ist. Offensichtlich können kurze Parameter genau so viel annehmen. nur benutzen sie keine Gleichen.

Hier ist ein Auszug aus ls --help( man lsgibt gleichwertige Informationen). Beachten Sie, wie einige haben eine lange Form ohne Kurzform ( --author, --block-size), einige haben eine Kurzform ohne eine lange Form ( -c, -f, -g), und einige haben sowohl eine Langform und eine Kurzform ( -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
quelle
4
Wie machen wir ein ls --helpauf Windows?
Pacerier
1
@ Pacerier Es gibt keine lsunter Windows. Der entsprechende Befehl wäre dir /?. Sie verwenden plattformübergreifende Software, die die üblichen Windows-Konventionen verletzt, siehe meine Antwort.
Daniel Beck
@ Pacerier Es ist nicht eingebaut, aber laden Sie es von Drittanbietern herunter, Gnuwin32 Sie laden es herunter (google gnuwin32). Es gibt eine Reihe von Paketen in gnuwin32, die jeweils Befehle enthalten. Laden Sie das Paket coreutils herunter, das viele gemeinsame Befehle enthält.
Barlop
In Ihrem ls --helpAuszug finden Sie lange Optionen ohne kurze Optionen . Siehe --authorund --block-size.
Dan
Um die Frage in @ Paceriers ursprünglichem Kommentar zu beantworten: Die gängigste Methode, mit der moderne Windows-Systeme den lsBefehl erhalten, ist die Verwendung von GIT . Die GIT-Bash-Shell oder das CMD-Fenster mit dem GIT-Bin im PATH haben ls.
Yzorg
34

Es gibt keinen verbreiteten Standard. Es gibt eine gewisse Konsistenz zB in GNU-Programmen, aber Sie müssen die Dokumentation jedes Programms überprüfen.

Zitiert Wikipedia , Hervorhebung von mir:

In Unix-ähnlichen Systemen wird häufig der ASCII-Bindestrich verwendet, um Optionen anzugeben. Auf das Zeichen folgen normalerweise ein oder mehrere Buchstaben . Ein Argument, bei dem es sich um einen einzelnen Bindestrich ohne Buchstaben handelt, gibt normalerweise an, dass ein Programm Daten verarbeiten soll, die von der Standardeingabe stammen, oder Daten an die Standardausgabe senden soll. In einigen Programmen werden zwei Bindestriche (-) verwendet, um "lange Optionen" anzugeben, bei denen aussagekräftigere Optionsnamen verwendet werden . Dies ist ein allgemeines Merkmal von GNU-Software.

In der Regel geben Bindestriche ein vordefiniertes Argument an. Ich denke, es wird verwendet, um sie von zB Dateinamen oder anderen Bezeichnungen zu unterscheiden, die Sie als Argumente verwenden könnten. Dies ist jedoch nicht immer der Fall (siehe unten).


Oft finden Sie das gleiche Argument sowohl als kurze als auch als lange Option, wie z . B. in ls .

Einige Programme verwenden einen einzelnen Bindestrich für Optionen mit einem Zeichen und zwei Bindestriche für Optionen mit mehreren Zeichen, aber nicht alle (GNU findkommt in den Sinn). Einige Programme haben optionale Bindestriche oder überspringen diese ganz ( taroder BSD pskommt in den Sinn).

Manchmal --fooerfordern lange Optionen ( ) Argumente, kurze Optionen ( -f) hingegen nicht (oder implizieren zumindest ein bestimmtes Standardargument).

Kurze Optionen (zB cut -d ' ') können Argumente haben, lange Optionen (zB ls --all) müssen sie nicht unbedingt haben.

Um ein bestimmtes Verhalten eines Programms festzulegen, müssen Sie manchmal eine kurze Option verwenden, für andere müssen Sie eine lange Option verwenden, und für einige haben Sie die Wahl.

In einem ähnlichen Zusammenhang können einige Programme keine Leerzeichen zwischen einer Option und ihrem Argument verarbeiten , während andere dies nicht können.

Wie ich am Anfang schrieb, gibt es einfach kein gemeinsames Verhalten oder Standard. Häufig können Sie ein ähnliches Verhalten wie in derselben Bibliothek verfolgen, die für das Parsen von Argumenten verwendet wird, aber Sie möchten wahrscheinlich nicht die Quellen lesen, um dies herauszufinden.

Sie können die Argument-Syntax eines Programms nicht wirklich von der eines anderen ableiten.


Wenn Sie auch Windows in Betracht ziehen, wird es noch schlimmer: Während die Windows-Befehlszeilenaufrufe traditionell /f(zumindest die meiste Zeit) einzelne Zeichen für Optionen verwenden, mit :als Trennzeichen zwischen Optionen und deren Wert (siehe z. B. hier ); plattformübergreifende Dienstprogramme sind weit verbreitet (wie die von Ihnen erwähnten) und bringen die häufigere Bindestrichsyntax für Argumente mit, mit all den oben genannten Inkonsistenzen.

Daniel Beck
quelle
2
Es sollte beachtet werden, dass die GNU-Standardbibliotheken die Funktionen zum Abbilden der Optionen Eins-minus-ein-Buchstabe, Zwei-minus-mehrere-Buchstaben bieten, sodass alle neuen GNU-Programme und die meisten neuen freien Programme im Allgemeinen diese Notation verwenden (z. B. - f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); throwbacks wie tar, ps, findund solche hatten ihre Befehlszeilensyntax von POSIX eingestellt , bevor dieser Standard vollständig geliert war. Auf einem Gnu / Linux-System ist es einigermaßen sicher, dass mindestens --help(fast) immer unterstützt wird, sowie man <command>oderinfo <command>
BRPocock
Sagt der GNU-Standard, dass Sie keine Kurzform ohne Langform und keine Langform ohne Kurzform haben sollten?
Barlop
+1 für die vollständigste Antwort, einschließlich der Erwähnung von GNU, finddas bei langen Optionen nicht der "GNU-Konvention" folgt (wahrscheinlich aus Gründen der POSIX-Konformität, wie @BRPocock hervorhob). Ich würde wieder +1 geben, wenn ich könnte, um DOS / Windows-Befehlszeilen- "Schalter" zu erwähnen, da die Frage des OP irgendwie mit "Windows" markiert wurde, und diese Konvention sollte der Vollständigkeit halber erwähnt werden.
TheDudeAbides
7

Dies ist eine Konvention von * nix. Doppelter Bindestrich steht vor Optionen, wenn sie vollständig geschrieben sind, während einfacher Bindestrich vor Optionen steht, wenn sie in Kurzform geschrieben sind . Beispielsweise ls --all --lkann auf gekürzt werden ls -al. Wie zu sehen ist, haben nicht alle Optionen ihre Äquivalente mit einem Buchstaben, obwohl dies in der Regel häufiger der Fall ist.

Unabhängig davon, wie Sie die Option eingeben, spielt es keine Rolle, ob die Option ein Argument annimmt oder nicht.

Wenn Sie sie für eine einmalige Verwendung schreiben, ist dies nicht wirklich wichtig, aber wenn Sie Befehle zum Beispiel in .alias-Dateien schreiben, ist es üblich, das vollständige Formular zu verwenden. Nur zur Erleichterung des Lesens für die nächste Person.

Turm
quelle
Hey, danke für die Hilfe. Gibt es einen Grund, warum du Unix als * nix eingibst?
Pacerier
2
@Pacerier - Unix ist ein Handelsname. Mit * nix meine ich eigentlich alle Unix- und ähnlichen Systeme, die für alle praktischen Zwecke gleich sind. Aber meistens ist es eine Gewohnheit ...
Turm
2
@Pacerier * nix kann sich auf Linux oder Unix beziehen. Ich bin mir nicht ganz sicher, ob ich mich vor einiger Zeit damit befasst habe, aber wenn ich mich recht erinnere, stammt BSD aus der Unix-Familie. Linux ist technisch gesehen nicht .. und FreeBSD auch nicht. Aber * nix zu sagen würde Unix / bsd und ähnliches beinhalten, zB Linux und Freebsd.
Barlop
2
+1 für die Erwähnung der Kurzbefehlskombination. Das ist der wahre Grund, warum es zwei Stile gibt.
Ryan_S
3

Dies sind herkömmliche UNIX-Syntaxen.

Ein Programmargument benötigt einen Bindestrich ("-"), gefolgt von einem einzelnen Buchstaben, wenn es sich um eine einfache Option handelt (z. B. -v ), und zwei Bindestriche ("-"), wenn die Option Argumente akzeptiert (z. B. --file toc.xml) oder --file = toc.xml )

Keine Auswirkung auf die Funktionalität des Programms.


quelle
3
In vielen Fällen, in denen nach einem Bindestrich Optionen für einzelne Buchstaben folgen, können Sie die Buchstaben auch zu Gruppen zusammenfassen. Zum Beispiel ist "ls -al" dasselbe wie "ls -a -l". Doppelstrichoptionen können auf diese Weise nicht kombiniert werden. Optionen mit einem Buchstaben sind ein älterer Standard, aber heutzutage werden viele Befehle beide Typen annehmen. Beispiel: "ls - all" ist dasselbe wie "ls -a".
Randy Orrison
3
Eigentlich noch eine Korrektur. Optionen mit einem Strich und einem Buchstaben können einen Parameter enthalten, sind jedoch normalerweise nicht mit einem Gleichheitszeichen verknüpft. Beispiel: "tail -n 50" zeigt die letzten 50 Zeilen einer Datei an, was "tail -lines = 50" entspricht.
Randy Orrison
Bedeutet diese Konvention, dass --noout(in der obigen Frage) eigentlich so geschrieben werden sollte, als hätte -nooutes keine Argumente ?
Pacerier
1
Was in dieser Antwort über Parameter gesagt wird, ist völlig falsch. Der erste Satz ist offensichtlich. Der letzte Satz ist offensichtlich. Und der Absatz in der Mitte, der die Frage beantworten soll, ist völlig falsch.
Barlop
@RandyOrrison Wenn ich noch nie einen einzelnen Buchstaben mit einem Gleichheitszeichen gesehen habe, werden häufig Parameter verwendet. !! Lasten nehmen Parameter an. Diese Antwort ist schrecklich
Barlop
3

single dash wird von getopt implementiert und ist eine posix-Standardfunktion, double dash in getopt_long und ist ein gnu-Standard.

Traditionell liefert ein einzelner Bindestrich eine einzelne Zeichenoption wie diese:

-A oder -V usw. müssen aber nicht darauf beschränkt sein. Beispiel: -Wall for gcc aktiviert alle Compiler-Warnungen für den Compiler-Befehl gcc.

Argumente mit doppelten Strichen sind in der Regel ausführlicher und verwenden häufig einen angegebenen Parameter wie --max-count = NUM. --Version ist jedoch nicht gleich.

Im Allgemeinen gibt es keine Regeln oder definierten Standards für die Angabe von Programmargumenten, sondern nur eine Reihe von Traditionen. Wenn jedoch die Befehlszeilen-Analysefunktionen getopt und getopt_long verwendet werden, sollten die Parameter im Allgemeinen dem Standard folgen, da die Bibliotheksfunktionen eine bestimmte Methode erzwingen.

Matt H
quelle