Einfache Bindestriche `-` für Optionen mit einem Zeichen, doppelte Bindestriche` --` für Wörter?

51

Woher kommt die Konvention, einfache Bindestriche für Buchstaben und doppelte Bindestriche für Wörter zu verwenden, und warum wird sie weiterhin verwendet?

Wenn ich zum Beispiel eingebe ls --help, siehst du:

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

Ich habe versucht, - and -- conventionauch mit Zitaten mit wenig Erfolg zu googeln .

Larry
quelle
6
Ich bin hier nur ein bisschen pingelig, aber der Charakter -wird technisch als Bindestrich bezeichnet . Wir verwenden das Wort "Bindestrich", um in den meisten Fällen auf den Bindestrich (-) und manchmal auf den Bindestrich (-) zu verweisen, aber keiner von beiden ist ein Bindestrich (-).
Chharvey
4
Es ärgert mich wirklich, wenn bekannte Programme nicht der Konvention folgen:java -version
Kimberly W
4
@Jamil Yeah. Ich bin hier gelandet und habe mich gefragt, warum das so istfind . -delete
Krzysztof Wende
Die Idee dabei ist, dass Sie Dinge schreiben können, -abdie sowohl aals auch aktivieren b. Ohne den Doppelstrich, -helpwürden die aktivieren h, e, l, und pOptionen.
Aaron Franke

Antworten:

61

In The Art of Unix Programming beschreibt Eric Steven Raymond, wie sich diese Praxis entwickelte:

In der ursprünglichen Unix-Tradition sind Befehlszeilenoptionen einzelne Buchstaben, denen ein einziger Bindestrich vorangestellt ist ... Der ursprüngliche Unix-Stil wurde auf langsamen ASR-33-Teletypen entwickelt, die Kürze zu einer Tugend machten. also die einbuchstabigen optionen. Das Gedrückthalten der Umschalttaste erforderte den tatsächlichen Aufwand. daher die Präferenz für Kleinbuchstaben und die Verwendung von "-" (anstelle des vielleicht logischeren "+"), um Optionen zu aktivieren.

Der GNU-Stil verwendet Optionsschlüsselwörter (statt Schlüsselwortbuchstaben), denen zwei Bindestriche vorangestellt sind. Es entwickelte sich Jahre später, als einigen der ziemlich ausgeklügelten GNU-Dienstprogramme die aus einem Buchstaben bestehenden Optionstasten ausgingen ( dies war ein Patch für das Symptom und kein Heilmittel für die zugrunde liegende Krankheit ). Es bleibt beliebt, weil GNU-Optionen leichter zu lesen sind als die Buchstabensuppe älterer Stile. 1

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

jasonwryan
quelle
Beachten Sie, dass getopt () erstmals 1985 veröffentlicht wurde, UNOS (der älteste UNIX-Klon) jedoch getargs () bereits 1982 veröffentlichte (es wurde 1980 geschrieben) und getargs () kurze Optionen und lange Optionen mit einem Strich (Multics-Stil) unterstützt. UNOS setzte massiv Single-Dash-Long-Optionen ein und UNOS wurde von ehemaligen AT & T-Mitarbeitern geschrieben. Im Jahr 1988 brachte GNU Double-Dash-Long-Optionen heraus, obwohl UNOS bestätigte, dass Single-Dash-Long-Optionen hervorragend funktionieren.
Schily
28

Ein Grund für die Fortsetzung der einzelnen Buchstaben Optionen zu verwenden, weil sie aneinandergereiht werden können: ls -ltrein viel einfacher , als zu geben ls --sort=time --reverse --format=long. Es gibt eine Reihe von Situationen, in denen beide gut zu gebrauchen sind. Versuchen Sie bei der Suche nach diesem Thema die Konvention "Unix-Befehlszeilenoptionen".

Arcege
quelle
1
+1 Danke, das hilft wirklich bei der Logik hinter der Implementierung.
Larry
Da UNIX ls nicht versteht ls --sort=time --reverse --format=long, ist es auch keine gute Idee, diese nicht standardmäßige Methode zu erwähnen.
Schily
6

Das Zitat von Raymond von @jasonwryan enthält einige nützliche Informationen, beginnt jedoch in der Mitte der Geschichte:

  • Denken Sie daran, dass Unix als eine Version von Multics mit reduziertem Umfang gestartet wurde und dass die Funktionen in Unix im Verlauf der Geschichte häufig Nachahmungen oder Anpassungen von Funktionen waren, die auf anderen Systemen angezeigt und verwendet wurden.
  • Das '-'Optionszeichen wurde in Multics verwendet. Bitsavers hat ein Handbuch für seine Benutzerbefehle .
  • Andere Systeme verwendeten andere Zeichen, von denen einige behaupten, dass sie effizienter '/'für Tastatureingaben sind (z. B. für TOPS und VMS) und andere weniger (z. B. '('für VM / SP CMS).
  • Multics- Optionen bestanden aus mehreren Zeichen, z. B. durch Unterstrich getrennte Schlüsselwörter.
  • Längere Multics-Optionen hatten häufig eine kürzere, abgekürzte Form, z. B. -printvs -pr(Seite 3-8).
  • Unix-Optionen bestanden aus einem Zeichen und wurden nach einigen Jahren getopteingeführt. Da es nicht Teil des ursprünglichen Unix war, gibt es Dienstprogramme, die nicht verwendet wurden getoptund unverändert belassen wurden. Aber dabei getoptgeholfen, Programme konsistent zu machen.

Auf der anderen Seite waren Unix-Optionen mit einem getoptZeichen. Andere Systeme, insbesondere alle größeren, verwendeten Schlüsselwörter. Einige (nicht alle) erlaubten die Abkürzung dieser Schlüsselwörter , dh nicht alle Zeichen, solange die Option eindeutig war. Bei diesem Test gibt es Fallstricke hinsichtlich der Mehrdeutigkeit. Zum Beispiel:

  • Anfang 1985 arbeitete ich an einem Programm, das auf PrimOS portiert werden musste . Die Entwickler von Prime konkurrierten mit mehreren anderen Unternehmen, indem sie eine Befehlssprache anboten, die die jeweils am häufigsten verwendeten Befehle nachahmte. Natürlich unterstützten sie Abkürzungen (wie auch VMS). Nachdem ich die Online-Hilfe gelesen hatte, tippte ich staund überlegte, ob ich sie bekommen sollte status. Das war die Abkürzung für startund nachdem der Befehlsinterpreter nichts zum Starten gegeben hatte , meldete er mich ab.
  • Das X-Toolkit (von xterm verwendet ) ermöglicht abgekürzte Optionen. Um dies effektiv in xterm zu nutzen, müssen die Befehlsparameter vorverarbeitet werden, um -v(für die Version) den Vorzug zu geben -vb(visuelle Glocke). Das X-Toolkit bietet keine direkte Möglichkeit, eine bevorzugte Option anzugeben, wenn Unklarheiten bestehen.

Aufgrund dieses Zweideutigkeitspotenzials ziehen es einige Entwickler vor, Abkürzungen nicht zuzulassen. Lynx verwendet beispielsweise Optionen mit mehreren Zeichen, ohne Abkürzungen zuzulassen.

Nicht alle Programme verwendet getopt: tarund psnicht. Auch nicht rcs(oder sccs), wie Sie sehen können, wenn Sie notieren, wo der Bindestrich optional und die Optionswerte optional waren.

In Anbetracht dessen haben die GNU-Entwickler die in anderen Systemen verwendeten Schlüsselwortoptionen angepasst, indem sie erweitert haben getopt, um eine lange Version jeder kurzen Option bereitzustellen. Zum Beispiel sagt textutils 1.0 changelog

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.

Die Änderung in fileutils war früher:

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.

und vielleicht findet jemand einen noch früher, aber es scheint, dass der Datei-Header das früheste Datum anzeigt:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

Das ist (zum Beispiel) gleichzeitig mit dem X Toolkit (1987). Die meisten Unix-Dienstprogramme, mit denen Sie vertraut sind (z. B. ls, ps), verwendeten die vorhandenen Optionen für einzelne Zeichen, die regelmäßige Besuche im Handbuch erfordern. Bei der Einführung getopt_longhaben die GNU-Entwickler dies nicht getan, indem sie zuerst neue Optionen hinzugefügt haben. sie begann durch die vorhandenen Optionen Tabelliermaschinen und eine passende lange Option bietet.

Weil sie das Hinzufügen zu einem bestehenden Repertoire gab es (wieder) das Problem des Konflikts mit dem bestehenden Optionen. Um dies zu vermeiden, haben sie die Syntax mit zwei Bindestrichen vor langen Optionen geändert.

Diese Programme getopt_longwerden aus den üblichen Gründen weiterhin auf diese Weise verwendet:

  • Skripte hängen von den Optionen ab; Entwickler sind nicht bestrebt, Skripte zu brechen
  • Es gibt einen schriftlichen Kodierungsstandard (der möglicherweise effektiv ist)
  • Niemand hat sich ein konkurrierendes Tool-Set ausgedacht, das ausgesprochen inkompatibel ist (sowohl BSDs als auch GNU-Entwickler kopieren Optionsnamen voneinander).
Thomas Dickey
quelle
3

In der Wikipedia- Befehlszeilenschnittstelle wird Folgendes gemeldet:

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 Minuszeichen (-) verwendet, um "lange Optionen" anzugeben, bei denen aussagekräftigere Optionsnamen verwendet werden. Dies ist ein allgemeines Merkmal von GNU-Software.

Enzotib
quelle
Dies beantwortet nicht die Frage, woher die Konvention stammt und warum sie weiterhin verwendet wird.
Chharvey
1

Ich vermute, dass aussagekräftigere Optionen gewünscht wurden und dass Sie sich bei längeren Optionen keine Gedanken mehr darüber machen müssen, ob Ihnen die einzelnen Zeichen ausgehen.

Sobald Sie sich für lange Optionen entschieden haben, haben Sie ein Problem, zumindest wenn Sie vorhaben, sowohl lange als auch kurze Optionen zu unterstützen. Ich bin mir nicht sicher, aber ich glaube, dass die Antwort von arcege den Schlüssel dazu enthält, warum - und -. Eine generische Verarbeitungsroutine, z. getopt_long () müsste wissen, ob ein einzelnes Befehlszeilenargument mehrere Optionen enthalten kann, z. -ltr. Daher müsste eine Verarbeitungsroutine in der Lage sein, zwischen den beiden zu unterscheiden. Wenn ich einen einzelnen Bindestrich (-) lese, kann der Rest des Befehlszeilenarguments mit mehreren Optionen übereinstimmen. Wenn ich einen doppelten Gedankenstrich (-) lese, muss der Rest des Befehlszeilenarguments mit einer einzelnen Option übereinstimmen.

Ich habe gerade getopt_long () benutzt und ich mag schon lange Optionen, da sie leichter zu merken sind und sich selbst dokumentieren. Wenn ich die folgenden zwei Befehle habe:

./aggregator -f 15

./aggregator - spülzeit 15

Ich würde sagen, dass die zweite Option, die die Long-Option verwendet, selbsterklärender ist.

nickdu
quelle
0

Es gibt wahrscheinlich ein paar Gründe, warum die beiden Methoden verwendet werden. Eine davon ist natürlich die Tradition. Programmierer und Benutzer sind Menschen, und Menschen erwarten, dass die Dinge auf eine bestimmte Weise funktionieren. Wenn es keinen Grund gibt, etwas zu ändern (und für eine Befehlszeile gibt es nicht viel Grund, etwas zu ändern), dann nicht.

Davon abgesehen weiß ich, dass es Tools gibt, die den einzelnen Bindestrich für eine lange Option verwenden oder die Bindestriche sogar ganz entfernen. Diese Werkzeuge können anfangs schwierig sein und in einem ansonsten einheitlichen System eher als Warzen hervorstechen.

Wenn ich den Unterschied zwischen den beiden lernte (und bevor es zur zweiten Natur wurde), erinnerte ich mich immer daran, dass der "kurze" Bindestrich mit den "kurzen" Optionen übereinstimmt, während der "lange" (oder doppelte) Bindestrich mit dem "langen" übereinstimmt. Optionen. Ich weiß nicht, ob diese Argumentation bei der Entwicklung des doppelten Bindestrichs verwendet wurde, aber es ist möglich.

Kevin Lacquement
quelle