Irgendwo habe ich einen Rant gegen Java / Javac gesehen, der angeblich eine Mischung aus Windows- und Unix-Stil verwendet
java -classpath ... -ea ... Something
IMHO, es ist keine Mischung, es ist genauso wie es find
funktioniert, nicht wahr? AFAIK zufolge sollte die Syntax POSIX-konform sein
java --classpath ... --ea ... Something
und -abcdef
würde bedeuten, 6 kurze Optionen auf einmal anzugeben. Ich frage mich, welche Version im Allgemeinen zu weniger Tipparbeit und weniger Fehlern führt.
Ich schreibe ein kleines Hilfsprogramm in Java und werde auf keinen Fall den Windows-Stil verwenden, /a /b
da ich mich hauptsächlich für Unix interessiere. Welchen Stil soll ich wählen?
java
unix
command-line
maaartinus
quelle
quelle
Antworten:
Sie finden die Konventionen für POSIX-Argumente im Kapitel Konventionen für Hilfsprogramme. Der POSIX-Stil besteht aus Optionen mit einem einzelnen Bindestrich, gefolgt von einem einzelnen Buchstaben, der die Option angibt, wobei der Argumentwert durch ein Leerzeichen von der Option getrennt ist.
Es gibt
find
zum Beispiel Ausnahmen von den Regeln , aber diese sind auf die historischen Unix-Präzedenzfälle zurückzuführen.X Windows (X11) verwendet
find
ähnliche Optionen für lange Namen mit einem Strich.Die Double-Dash-Optionen für lange Namen wurden von GNU entwickelt (nach einem Umweg, der
+
als Präfix verwendet wurde).In dieser StackOverflow- Frage finden Sie eine Diskussion über die Vielzahl der bekannten Kommandozeilen-Argumentbehandlungssysteme - es gibt viele. ( Da dies geschrieben wurde, die Befugnisse-that-werden , um die Frage SO beschlossen 367309 war nicht eine gute Passform für SO. Ich die Antwort auf eine andere Frage übertragen haben, was die allgemeine Syntax einer Unix - Shell - Befehl ist? . )
Sie können die Liste der Techniken erweitern, um
git
(und eine Reihe anderer Systeme) abzudecken, bei denen Sie eine Struktur erhalten wie:basecommand
[ globale Optionen ]subcommand
[ Unterbefehlsoptionen ] [Name ...]Es kann viele Unterbefehle geben, von denen jeder ein eigenes Lexikon mit Optionen enthält.
Natürlich verwendet Windows einen (verwendeten) Schrägstrich "
/
", um Optionen anstelle des Bindestrichs "-
" anzugeben .JCL (für z / OS, OS / 360 und Zwischensysteme) verwendet in der Regel durch Kommas getrennte Positionsparameter und wird im Allgemeinen als nicht benutzerfreundlich oder als gute Schnittstelle angesehen.
quelle
git
.EDIT: Es wurde darauf hingewiesen, dass dieser Stil ein GNU-ismus ist und dass Unixe, die nicht auf GNU basieren, in der Regel eine Single-Dash-Syntax verwenden (insbesondere OS X- und BSD-Varianten).
Trotz des GNU-Status verwenden viele neu geschriebene Programme im Unix-Stil diesen Stil:
--long-option
für lange Optionsnamen-s
für kurze (Ein-Zeichen-) Optionen,-abc
für mehrere kurze Optionen ohne Argumente (ein Zeichen pro Option).--long arg
oder--long=arg
für lange Optionen,-s arg
,-sarg
oder (optional)-s=arg
für kurze Optionen. Dies kann mit anderen kurzen Optionen kombiniert werden, sofern nur die letzte ein Argument enthält.Jeder, der längere Zeit eine Linux-Shell verwendet hat, sollte mit diesem Stil 1 vertraut sein , damit er das Prinzip der geringsten Überraschung auf seiner Seite hat. Es ist auch schön, die Gruppierung mehrerer kurzer Optionen zuzulassen, ohne mit langen Optionen mehrdeutig zu sein.
1 Zum Beispiel einige der Programme mit diesem Stil (auf meinem Linux - Rechner):
ls
,grep
,man
,sed
,bash
usw. ( EDIT: diese sind offenbar GNU-isms obwohl, BSD und O X - Maschinen verwenden Sie diesen Stil nicht)Es gibt mehrere Bibliotheken, die sich darum kümmern können, dies für Sie zu analysieren (die bekannteste ist die Implementierung von getopt durch GNU ). Sie müssen lediglich angeben, welche Long- und Short-Optionen vorhanden sind, ob sie ein Argument annehmen und was wann zu tun ist Option gefunden. (Und natürlich, was für Positionsargumente zu tun ist, dh solche, die nicht mit
-
früheren Optionen beginnen und keine Argumente für diese sind)find
ist ein sehr altes Programm (oder wahrscheinlich eine neu geschriebene Version eines sehr alten Programms), das nicht einfach geändert werden kann, um eine neue Befehlszeilensyntax zu verwenden. Zu viele Skripte würden kaputt gehen und zu viele Benutzer, die an die alte Syntax gewöhnt sind, würden sich beschweren.javac
wurde wahrscheinlich vongcc
und Freunden beeinflusst, die aus historischen Gründen ebenfalls einer alten Syntax folgen.quelle
--long-arg
) ist eine GNU-Konvention (siehe deren getopt- Implementierung).Für Ihr Java-Projekt sollten Sie GNU getopt für Java oder Apache CLI ausprobieren . Sie unterstützen beide Konventionen.
Eine dritte Möglichkeit besteht darin, Java VM-Argumente zu verwenden und sie von der Laufzeit für Sie analysieren zu lassen:
Und dann im Code:
Persönlich würde ich das
-D
Idiom verwenden und die Java-Beschwörung in ein Shell-Skript einbinden, das das Kommandozeilen-Parsen einschließlich der Überprüfung des Klassenpfads usw. übernimmt. Dies macht es auch für native Benutzer einfacher, Ihr Java-Programm auszuführen.quelle
Es hängt davon ab, ob. Ich persönlich bevorzuge den POSIX-Stil, aber in Ihrem Fall würde ich wahrscheinlich die Konsistenz mit der Umgebung anstreben, in der Ihr Tool verwendet werden soll. Dies bedeutet, dass Sie die Java-Konvention für JARs verwenden (es sei denn, Sie möchten ein Wrapper-Skript verwenden, das es wie einen typischen Unix-Befehl aussehen lässt).
quelle