2012-05-30 5 views
12

Es scheint, dass die meisten (viel) Befehle Option Argumente wie folgt implementieren:Kurze/lange Optionen mit Optionsargument - ist das eine Art Konvention?

  1. wenn eine kurze Option erfordert eine Option Argument, die Option von einem Leerzeichen aus dem Optionsargument getrennt ist, z

    $ head -n 10 
    
  2. wenn eine lange Wahl Option Argument erforderlich ist, wird die Möglichkeit, durch eine vom = Optionsargument getrennt, z.B.

    $ head --lines=10 
    

Ist das eine Art von Konvention und ja, wo kann ich ihn finden? Außerdem, was ist die Begründung?

Warum z.B. ist es nicht

?

+4

Viele Befehle, die lange Optionen nehmen, haben das Gleichheitszeichen als optional. GNU 'head' und' grep' zum Beispiel. Aus 'man getopt_long':" Eine lange Option kann einen Parameter der Form --arg = param oder --arg param haben. " Die man-Seiten für die einzelnen Dienstprogramme dokumentieren normalerweise nicht, dass das Gleichheitszeichen optional ist. –

+1

@DennisWilliamson Gleichheitszeichen vor einem lange Option Argument nicht optional ist (und daher nicht entspricht Leerzeichen), wenn das Argument selbst als mit einem Standardwert ist optional, wenn nicht angegeben. betrachte 'ls --color', was standardmäßig auf' alw [ays] 'gesetzt ist. Durch das Weglassen des Gleichheitszeichens in diesem Beispiel würde die Eingabe als eine Datei oder ein Verzeichnis für den Befehl angesehen werden. – Chinggis6

+1

@ Chinggis6: Es hängt von dem Dienstprogramm und der Option ab. Ihr Beispiel von 'ls' erfordert das Gleichheitszeichen, aber betrachten:' echo foo | grep --regexp o' - es funktioniert mit oder ohne gleich, wie '--max-count'. Allerdings benötigt 'grep --color' das gleiche! –

Antwort

24

Die kurze Option Begründung ist in der POSIX Utility Conventions dokumentiert. Die meisten Optionsparser erlauben es, den Wert an den Buchstaben "anzufügen" (-n10), hauptsächlich wegen des umfangreichen historischen Präzedenzfalles.

Die lange Option Begründung wird von GNU in ihrer Coding Standards und in der Handbuchseite für getopt_long() angegeben.


Es war einmal vor langer Zeit, in einem Stackoverflow von vor langer Zeit gab es eine Frage zu command option styles. Nicht vielleicht eine gute Frage, aber ich denke, die Antworten haben es gerettet (aber ich gebe Vorurteile zu). Wie auch immer, es wurde seitdem gelöscht, also werde ich meine Antwort hier wiederbeleben, weil (a) es ein schmerzhafter Prozess war, die Antwort wieder zu entdecken und (b) es nützliche Informationen in Bezug auf Optionen enthält.

Wie viele verschiedene Arten von Optionen erkennen Sie? Ich kann viele denken, einschließlich:

  • Einzel-Buchstaben-Optionen, die von einzelnem Bindestrich vorangestellt, gruppierbaren, wenn kein Argument, Argument kann auf Option Brief oder in nächstem Argumente angebracht werden (viele, viele Unix-Befehle, die meisten POSIX Befehle).
  • Einzel-Buchstaben-Optionen, die von einzelnen Bindestrich vorangestellt, nicht erlaubt Gruppierung, müssen Argumente (RCS) angebracht werden.
  • Ein-Buchstaben-Optionen, die durch einen einfachen Strich vorangestellt werden, Gruppierung nicht erlaubt, Argumente müssen getrennt sein (Pre-POSIX-SCCS, IIRC).
  • Multi-Buchstaben-Optionen, die von einzelnem Bindestrich vorangestellt, können Argumente nächstes Argument (X11-Programme) angebracht oder in werden.
  • Multi-Buchstaben-Optionen, die von einzelnen Bindestrich voran kann (Atria Clearcase) abgekürzt werden.
  • Optionen mit mehreren Buchstaben, denen ein einzelnes Plus vorausgeht (veraltet).
  • Optionen mit mehreren Buchstaben, gefolgt von einem Doppelstrich; Argumente können "=" folgen oder getrennt sein (GNU-Utilities).
  • Optionen ohne Präfix/Suffix, einige Namen haben Abkürzungen oder impliziert sind, müssen Argumente getrennt sein.(AmigaOS Shell, ergänzt durch porneL)

Optionen ein optionales Argument nehmen manchmal angebracht werden müssen, manchmal muss ein ‚=‘ Zeichen folgen. POSIX unterstützt optionale Argumente nicht sinnvoll (das POSIX getopt() erlaubt ihnen nur die letzte Option in der Kommandozeile).

Alle vernünftigen Optionssysteme verwenden eine Option bestehend aus Doppelstrich ('--') allein, um "Ende der Optionen" zu bedeuten - die folgenden Argumente sind "Nicht-Optionsargumente" (normalerweise Dateinamen), auch wenn sie mit beginnen ein Strich. (Ich betrachte die Unterstützung dieser Notation als Imperativ.) Wenn Sie einen Befehl cmd mit einer Option -f haben, der ein Argument erwartet, dann wird, wenn Sie ihn mit -- anstelle des Arguments (cmd -f -- -other) aufrufen, viele Versionen von getopt() die -- wie der Dateiname für -f und dann -other als reguläre Optionen analysieren. das heißt, -- beenden die Option nicht aus, wenn es auf eine andere Option als Argument interpretiert werden muss.

Viele, aber nicht alle Programme Bindestrich als akzeptieren ein Dateiname für die Standardeingabe (normalerweise) oder die Standardausgabe (gelegentlich) Manchmal können, wie bei GNU 'tar', beide in einer einzigen Befehlszeile verwendet werden:

tar -cf - -F - | ... 

Der erste Solo-Strich bedeutet "schreibe nach stdout"; das zweite bedeutet "lese Dateinamen von stdin".

Einige Programme verwenden andere Konventionen — das heißt, Optionen, denen kein Bindestrich vorangestellt ist. Viele davon stammen aus den ältesten Tagen von Unix. Zum Beispiel ‚Teer‘ und ‚Ar‘ beide akzeptieren Optionen ohne Bindestrich, so:

tar cvzf /tmp/somefile.tgz some/directory 

Der dd Befehl verwendet opt=value ausschließlich:

dd if=/some/file of=/another/file bs=16k count=200 

Einige Programme ermöglichen es Ihnen, Optionen und andere Argumente verschachteln vollständig; Der C-Compiler make und die GNU-Utilities, die ohne POSIXLY_CORRECT in der Umgebung laufen, sind Beispiele. Viele Programme erwarten, dass die Optionen den anderen Argumenten vorangehen.


Moderne Programme wie git zunehmend scheinen einen Basisbefehlsnamen (git) von einem Unterbefehl (commit), gefolgt von Optionen (-m "Commit message") gefolgt zu verwenden. Dies wurde durch die Schnittstelle sccs zu den SCCS-Befehlen und dann durch cvs vorhergesagt und wird auch von svn verwendet (und sie sind alle Versionskontrollsysteme). Andere große Befehlsfolgen übernehmen jedoch ähnliche Stile, wenn dies angemessen erscheint.


Ich habe keine starken Präferenzen zwischen den verschiedenen Systemen. Wenn es nur wenige Optionen gibt, sind einzelne Buchstaben mit einem mnemonischen Wert praktisch. GNU unterstützt dies, empfiehlt jedoch, es mit mehrzeiligen Optionen zu sichern, denen ein Doppelstrich vorausgeht.

Es gibt einige Dinge, gegen die ich mich wende. Eine der schlimmsten ist, dass derselbe Optionsbrief mit unterschiedlichen Bedeutungen verwendet wird, abhängig davon, welche anderen Optionsbuchstaben ihm vorangestellt wurden. In meinem Buch ist das ein No-No, aber ich weiß von Software, wo es gemacht wird.

Ein anderes unerwünschtes Verhalten ist Inkonsistenz in der Art Argumente der Handhabung (insbesondere für ein einzelnes Programm, sondern auch innerhalb einer Gruppe von Programmen). Sie benötigen entweder angefügte Argumente oder erfordern abgetrennte Argumente (oder erlauben beides), haben jedoch einige Optionen, die ein angehängtes Argument erfordern, und andere, die ein losgelöstes Argument erfordern. Und sei konsistent darüber, ob '=' verwendet werden kann, um die Option und das Argument zu trennen.

Wie bei vielen, vielen (softwarebezogen) Dinge — Konsistenz ist wichtiger als die einzelnen Entscheidungen.


Was immer Sie tun, bitte, lesen Sie die TAOUP's Command-Line Options und Standards for Command Line Interfaces betrachten. (hinzugefügt von J F Sebastian — danke; stimme zu.)

+1

+1 WOW! Diese Antwort bietet alles, wovon ich nur träumen kann! Danke für die Zeit und Mühe, die Sie investiert haben! – helpermethod