Beispielsweise:
xargs -n 1
ist das gleiche wie
xargs -n1
Wenn Sie sich jedoch die Manpage ansehen , wird die Option als aufgeführt -n max-args
, was bedeutet, dass der Speicherplatz beibehalten werden soll. Es gibt nichts über die abgekürzte Form -n max-args .
Dies ist auch bei vielen anderen Linux-Dienstprogrammen der Fall.
Wie heißt das unter Linux? Unterstützen alle Dienstprogramme das abgekürzte Formular (aber dokumentieren Sie es niemals in der Manpage)?
Antworten:
Wenn Sie das Befehlszeilen-Parsing-Bit Ihres Codes schreiben, geben Sie an, welche Optionen Argumente annehmen und welche nicht. Beispiel: In einem Shell-Skript akzeptieren Sie eine
-h
Option (z. B. Hilfe) und eine-a
Option, die ein Argument enthalten sollDas
a:h
Bit sagt "Ich erwarte, zwei Optionen zu analysieren,-a
und-h
, und-a
sollte ein Argument nehmen" (es ist das:
Aftera
, das dem Parser sagt, dass es-a
ein Argument nimmt).Daher gibt es keine Unklarheit, wo eine Option endet, wo ihr Wert beginnt und wo eine andere danach beginnt.
Laufen es:
Aus diesem Grund sollten Sie die meiste Zeit keinen eigenen Befehlszeilenparser schreiben, um Optionen zu analysieren.
In diesem Beispiel gibt es nur einen Fall, der schwierig ist. Das Parsen stoppt normalerweise bei der ersten Nicht-Option. Wenn Sie also Dinge in der Befehlszeile haben, die wie Optionen aussehen :
Das Folgende löst das:
Das
--
signalisiert ein Ende der Befehlszeilenoptionen, und das-world
Bit bleibt dem Programm übrig, um zu tun, was es will (es befindet sich in einer der Positionsvariablen).Das ist übrigens, wie Sie eine Datei entfernen, die einen Bindestrich am Anfang ihres Dateinamens mit hat
rm
.EDIT :
In C aufgerufene
getopt()
(in deklarierteunistd.h
) Dienstprogramme, die auf die gleiche Weise funktionieren. Soweit wir wissen, kann diebash
Funktiongetopts
tatsächlich unter Verwendung eines Aufrufs der C-Bibliotheksfunktion implementiert werdengetopt()
. Perl, Python und andere Sprachen verfügen über ähnliche Befehlszeilen-Analysebibliotheken, und es ist sehr wahrscheinlich, dass sie ihre Analyse auf ähnliche Weise durchführen.Einige dieser
getopt
undgetopt
ähnliche Bibliotheksroutinen verarbeiten auch "lange" Optionen. Vor diesen steht normalerweise double-dash (--
), und lange Optionen, die Argumente enthalten, werden häufig nach einem Gleichheitszeichen angegeben, z. B. die--block-size=SIZE
Option [einiger Implementierungen] desdu
Dienstprogramms (mit der auch-B SIZE
dasselbe angegeben werden kann).Die Grundhandbücher werden oft geschrieben, um ein Leerzeichen zwischen den kurzen Optionen anzuzeigen, und ihre Argumente dienen wahrscheinlich der Lesbarkeit.
BEARBEITEN : Wirklich alte Werkzeuge, wie die
dd
undtar
Dienstprogramme, haben Optionen ohne Bindestriche vor sich. Dies geschieht ausschließlich aus historischen Gründen und um die Kompatibilität mit Software aufrechtzuerhalten, die darauf angewiesen ist, dass sie genau so funktioniert. Dastar
Dienstprogramm hat in jüngster Zeit die Möglichkeit erhalten, Optionen mit Bindestrichen zu verwenden. Das BSD-Handbuch fürtar
ruft die alten Optionen für "gebündelte Flags" auf.quelle
getopt()
(deklariert inunistd.h
), was dasselbe macht.-a -b
===-ab
-a
optionales Argument vorhanden ist,-ab
ist dies nicht dasselbe wie-a -b
). GNU getopt stoppt die Verarbeitung von Flags nicht, wenn ein Nicht-Flag gefunden wird: Stattdessen (standardmäßig) werden die Flags vor argv neu gemischt.xargs
ist eines der POSIX-Dienstprogramme. Wie von @drewbenn kommentiert, dokumentiert POSIX das Verhalten beim Analysieren von Optionen, damit die meisten seiner Dienstprogramme übereinstimmengetopt
, mit einigen Zulassungen für andere Implementierungen. In 12.1 Utility Argument Syntax heißt es :und abschließend mit
In POSIX (denken Sie daran, dass es nur die am häufigsten verwendeten Dienstprogramme abdeckt) gibt es Ausnahmen, die Operanden übergeben, die Optionen in anderen Dienstprogrammen sind, entweder als Positionsparameter oder als Parameter mit spezieller Syntax :
POSIX erlaubt optionale Optionswerte:
Ich kann mich nicht erinnern, welche POSIX-Dienstprogramme diese Funktion verwenden. Die ncurses
tic
undinfocmp
Dienstprogramme verwenden die Funktion für Ebenen der-v
Option (verbose / debug).Der spezielle Punkt, nach dem Sie gefragt haben, wird im Rest dieses Absatzes in mehreren Zeilen beschrieben.
Vor POSIX einige Implementierungen
ps
akzeptierter Optionen ohne führenden Bindestrich. In der POSIX-Beschreibung wird Folgendes in der Beschreibung des Dienstprogramms oder in der Syntaxbegründung nicht erwähnt:Abgesehen von POSIX gibt es Implementierungen mit langen Optionen (wie GNU getopt_long oder X Toolkit ), bei denen auf verschiedene Arten der Wert einer Option von der Option getrennt oder mit ihr verknüpft wird . Beispielsweise kann Interpunktion verwendet werden:
Abhängig von der Implementierung kann ein doppelter Gedankenstrich verwendet werden, um lange Optionen von kurzen zu unterscheiden (getopt): lynx und X Toolkit verwenden einen einzelnen Gedankenstrich; GNU
getopt_long
verwendet zum Beispiel einen Doppelstrich. A+
kann auch verwendet werden, um anzuzeigen, dass eine Option negiert ist.In der Beschreibung von POSIX werden diese offenbar nicht erwähnt, aber Sie werden ihnen mit Sicherheit begegnen.
quelle
-option=value
es sein--option=value
? (Das Long-Option-Format, zwei Striche am Anfang anstelle von einem)