Wie lautet die allgemeine Syntax eines Unix-Shell-Befehls?

8

Warum sind den Optionen zu einigen Befehlen manchmal ein + -Zeichen und manchmal ein - -Zeichen vorangestellt?

zum Beispiel:

%Vor%     
Lazer 29.01.2010, 05:32
quelle

4 Antworten

18

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.

Welche Arten der Optionsverarbeitung gibt es?

[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:

  • Ein-Buchstaben-Optionen, denen ein einzelner Strich vorausgeht, gruppierbar, wenn vorhanden kein Argument, Argument kann dem Optionsbuchstaben oder dem nächsten angehängt werden Argument (viele, viele Unix-Befehle; die meisten POSIX-Befehle).
  • Einbuchstabige Optionen mit einem einzelnen Bindestrich, Gruppierung nicht erlaubt, Argumente müssen angehängt werden (RCS).
  • Einbuchstabige Optionen mit einem einzelnen Bindestrich, Gruppierung nicht erlaubt, Argumente müssen getrennt sein (Pre-POSIX SCCS, IIRC).
  • Optionen mit mehreren Buchstaben, denen ein einzelner Strich vorausgeht, können Argumente sein angehängt oder im nächsten Argument (X11-Programme; auch Java und viele Programme auf Mac OS X mit einem NeXTSTEP-Erbe).
  • Optionen mit mehreren Buchstaben, denen ein einzelner Bindestrich vorangestellt ist, können abgekürzt werden (Atria Clearcase).
  • Optionen mit mehreren Buchstaben, denen ein einzelnes Plus vorausgeht (obsolet).
  • Optionen mit mehreren Buchstaben, denen ein Doppelstrich vorangestellt ist; Argumente können folgen "=" oder sei getrennt (GNU-Dienstprogramme).
  • Optionen ohne Präfix / Suffix, einige Namen haben Abkürzungen oder sind implizierte Argumente müssen getrennt sein. ( AmigaOS Shell )

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:

%Vor%

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 :

%Vor%

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:

%Vor%

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

    
Jonathan Leffler 29.01.2010, 05:53
quelle
5

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!

    
Carl Norum 29.01.2010 05:37
quelle
1

Es ist Apps überlassen, Optionen zu analysieren, daher die Inkonsistenz. In Ihrem Sortierbeispiel sind diese alle gleichwertig für Coreutils:

%Vor%     
pixelbeat 29.01.2010 14:49
quelle
1

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

    
Norman Ramsey 29.01.2010 23:19
quelle

Tags und Links