Der POSIX-Standard verwendet heutzutage getopt()
(aka getopt(3)
) wird häufig als Standard-Notation verwendet, aber in den frühen Tagen experimentierten die Leute. Auf einigen Computern unterstützt der Befehl sort
nicht mehr die Schreibweise +
. Verschiedene Befehle (insbesondere ar
und tar
) akzeptieren Steuerelemente ohne Präfixzeichen - und dd
(auf die in einem Kommentar von Alok angespielt wird) verwendet insgesamt eine andere Konvention.
Die GNU-Konvention der Verwendung von ' --
' für lange Optionen (unterstützt von getopt_long(3)
) war geändert von der Verwendung von ' +
'. Natürlich verwendet die X11-Software einen einfachen Strich vor Multi-Zeichen-Optionen. Also, das Ganze ist eine Sammlung historischer Relikte, während die Leute experimentierten mit dem besten Umgang damit.
POSIX dokumentiert die Utility-Konventionen , mit denen es arbeitet, außer wenn der Präzedenzfall in der Vergangenheit stärker ist.
[Zu einer bestimmten Zeit enthielt SO 367309 das folgende Material als meine Antwort. Es wurde ursprünglich 2008-12-15 02:02 von FerranB gestellt, wurde aber anschließend geschlossen und gelöscht.]
Wie viele verschiedene Arten von Optionen kennen Sie? Ich kann mir vorstellen viele, einschließlich:
Bei Optionen, die ein optionales Argument verwenden, muss manchmal das Argument angehängt werden ( co -p1.3 rcsfile.c
),
manchmal muss es einem '=' Zeichen folgen. POSIX unterstützt nicht optional
Argumente sinnvoll (das POSIX getopt () erlaubt ihnen nur das letzte
Option in der Befehlszeile).
Alle sinnvollen Optionssysteme verwenden eine Option, die aus einem Doppelstrich besteht
(' --
') allein bedeutet "Ende der Optionen" - die folgenden Argumente sind
"Nicht-Optionsargumente" (normalerweise Dateinamen; POSIX nennt sie "Operanden")
auch wenn sie mit einem beginnen
Strich. (Ich betrachte die Unterstützung dieser Notation als Imperativ. Beachten Sie, dass, wenn der Option --
eine Option vorangestellt ist, die ein Argument erfordert, der --
als Argument für die Option behandelt wird und nicht als der Marker 'Ende der Optionen' .)
Viele, aber nicht alle Programme akzeptieren einen einzelnen Strich als Dateinamen
Standard-Eingang (normalerweise) oder Standard-Ausgang (gelegentlich). Manchmal,
Wie bei GNU ' tar
' können beide in einer einzigen Befehlszeile verwendet werden:
Der erste Solo-Strich bedeutet "schreibe in stdout"; die zweite bedeutet "Datei lesen" Namen von stdin '.
Einige Programme verwenden andere Konventionen - Optionen, denen kein a vorausgeht Strich. Viele davon stammen aus den ältesten Tagen von Unix. Beispielsweise, 'tar' und 'ar' akzeptieren Optionen ohne Bindestrich, also:
%Vor% Der Befehl dd
verwendet ausschließlich opt=value
:
Einige Programme erlauben es Ihnen, Optionen und andere Argumente zu verschachteln vollständig; der C-Compiler, make und die GNU-Utilities laufen ohne POSIXLY_CORRECT in der Umgebung sind Beispiele. Viele Programme erwarten es die Optionen, die den anderen Argumenten vorangehen.
Beachten Sie, dass git
und andere VCS-Befehle oft ein hybrides System verwenden:
Es gibt einen Unterbefehl als eines der Argumente. Oft gibt es optionale "globale" Optionen, die zwischen dem Befehl und dem Unterbefehl angegeben werden können. In POSIX gibt es dafür Beispiele; Der Befehl sccs
befindet sich in dieser Kategorie. Sie können argumentieren, dass einige der anderen Befehle, die andere Befehle ausführen, ebenfalls in dieser Kategorie enthalten sind: nice
und xargs
springt von POSIX aus in den Sinn; sudo
ist ein Nicht-POSIX-Beispiel, ebenso wie svn
und cvs
.
Ich habe keine starken Präferenzen zwischen den verschiedenen Systemen. Wann Es gibt nur wenige Optionen, dann einzelne Buchstaben mit mnemonischen Werten sind bequem. GNU unterstützt dies, empfiehlt aber, es mit zu sichern Optionen mit mehreren Buchstaben, denen ein Doppelstrich vorangestellt ist.
Es gibt einige Dinge, gegen die ich mich wende. Einer der schlimmsten ist der gleiche Optionsbuchstaben werden mit unterschiedlichen Bedeutungen verwendet, abhängig von dem jeweils anderen Optionsbuchstaben sind ihm vorausgegangen. In meinem Buch ist das ein Nein, aber ich weiß es von Software, wo es gemacht wird.
Ein weiteres unerwünschtes Verhalten ist die Inkonsistenz in der Handhabung
Argumente (vor allem für ein einzelnes Programm, aber auch innerhalb einer Suite von
Programme). Sie benötigen entweder angehängte Argumente oder erfordern detached
Argumente (oder erlauben Sie entweder), aber haben einige Optionen, die ein erfordern
angehängtes Argument und andere erfordern ein losgelöstes Argument. Und sei
konsistent darüber, ob ' =
' verwendet werden kann, um die Option zu trennen und
das Argument.
Wie bei vielen, vielen (softwarebezogenen) Dingen - Konsistenz ist mehr wichtiger als die individuellen Entscheidungen. Verwenden von Tools, die automatisieren und standardisieren die Argumentverarbeitung hilft mit Konsistenz.
Was auch immer Sie tun, lesen Sie bitte die TAOUP Befehlszeilenoptionen und Betrachten Sie Standards für Befehlszeilenschnittstellen . ( Hinzugefügt von J F Sebastian - danke; Ich stimme zu. )
Es ist völlig willkürlich; Der Befehl kann die gesamte Optionsverarbeitung auf seine spezielle Weise implementieren oder andere Komfortfunktionen aufrufen. Die getopt()
-Familie von Funktionen ist ziemlich populär, so dass die meisten Programme, die sogar remote geschrieben wurden, den Konventionen dieser Routinen folgen. Es gibt natürlich immer Ausnahmen!
Ein Shell-Befehl ist nur ein Programm, und es ist frei, seine Befehlszeile beliebig zu interpretieren. Unix hatte nie so etwas wie Apples Interface-Police, um sicherzustellen, dass die Befehlszeilenschnittstelle in den Anwendungen konsistent war. Dies führt insbesondere bei älteren Befehlen zu Inkonsistenzen.
Wenn ich in meine Kristallkugel gucke, denke ich, dass Befehlszeilentools langsam in Richtung GNU-Standards, doppelte Striche und so weiter migrieren werden. (Ich bin mit einzelnen Strichen aufgewachsen und finde den Doppelstrich immer noch sehr peinlich, aber ist konsistent.)