Auf POSIX-Systemen (z. B. Linux, MacOSX) würde ich, zumindest für Programme, die möglicherweise in einem Shell-Terminal gestartet wurden (z. B. den meisten von ihnen), die Verwendung der GNU-Kodierungskonventionen empfehlen (in denen auch gebräuchliche Argumentnamen aufgeführt sind) und in den Richtlinien für POSIX-Dienstprogramme nachsehen , auch für proprietäre Software:
immer behandeln --version
und--help
( /bin/true
akzeptiert sie sogar !!). Ich verfluche die Autoren von Software nicht verstehend --help
, ich hasse sie (weil prog --help
es der erste Befehl ist, den ich auf einem neuen Programm versuche)! Oft --help
kann als abgekürzt werden-h
Lassen Sie die --help
Nachricht alle Optionen auflisten (es sei denn, Sie haben zu viele davon ... in diesem Fall listen Sie die am häufigsten verwendeten auf und verweisen Sie explizit auf eine man
Seite oder eine URL) und Standardwerte von Optionen, und möglicherweise wichtig (und programmspezifisch) ) Umgebungsvariablen. Diese Optionslisten bei Optionsargumentfehler anzeigen.
akzeptieren -a
kurze Argument (Einzelbuchstaben) und einige Äquivalent haben --long-argument
, so -a2
--long-argument=2
, --long-argument 2
; Natürlich könnten Sie (für selten verwendete Optionen) einen --only-long-argument
Namen haben; für modale Argumente ohne zusätzliche Optionen -cf
wird in der Regel wie folgt vorgegangen: -c -f
usw. Ihr -argument:value
Vorschlag ist also komisch, und ich empfehle, dies nicht zu tun.
benutze GLIBC getopt_long oder besser (zB argp_parse , in OCaml ist es ein Arg
Modul , ...)
verwenden oft -
für Standard - Ein- oder Ausgang (wenn Sie nicht tun können, handhaben /dev/stdin
und /dev/stdout
auch auf die wenigen Betriebssysteme mit ihnen nicht)
das Verhalten ähnlicher Programme nachahmen, indem die meisten ihrer Optionskonventionen wiederverwendet werden; insbesondere -n
für Trockenlauf (à la make
), -h
für Hilfe, -v
für Ausführlichkeit, etc ...
Verwenden Sie --
als Trennzeichen zwischen Optionen und Dateien oder anderen Argumenten
Wenn Ihr Programm verwendet isatty
, um zu testen, dass stdin ein Terminal ist (und sich in diesem Fall "interaktiv" verhält), stellen Sie eine Option bereit, um den nicht interaktiven Modus zu erzwingen, ebenso, wenn Ihr Programm eine GUI-Oberfläche hat (und getenv("DISPLAY")
auf dem X11-Desktop testet ), dies aber auch könnte in Batch oder Kommandozeile verwendet werden.
Einige Programme (z. B. gcc
) akzeptieren indirekte Argumentlisten, @somefile.txt
dh, sie lesen Programmargumente aus somefile.txt
. Dies kann nützlich sein, wenn Ihr Programm sehr viele Argumente akzeptiert (mehr als die Ihres Kernels ARG_MAX
).
Übrigens können Sie sogar einige automatische Vervollständigungsfunktionen für Ihr Programm und übliche Shells (wie bash
oder zsh
) hinzufügen.
Einige alte Unix-Befehle (z. B. dd
oder sogar sed
) haben seltsame Befehlsargumente für die historische Kompatibilität. Ich würde empfehlen, ihren schlechten Gewohnheiten nicht zu folgen (es sei denn, Sie machen eine bessere Variante davon).
Wenn Ihre Software eine Reihe von zugehörigen Befehlszeilenprogramme, nehmen Inspiration von git (was Sie sicherlich als Entwicklungswerkzeug verwenden), die akzeptiert git help
und git --help
und haben viele git
subcommand
undgit
subcommand
--help
In seltenen Fällen können Sie auch verwenden argv[0]
(indem Sie Symlinks in Ihrem Programm verwenden), z. B. bash
aufgerufen, weil rbash
ein anderes Verhalten vorliegt ( eingeschränkte Shell). Aber normalerweise empfehle ich das nicht. Es kann sinnvoll sein, Ihr Programm als Skriptinterpreter mit shebang zu verwenden, dh #!
in der ersten Zeile, die von execve (2) interpretiert wird . Wenn Sie solche Tricks ausführen, müssen Sie sie dokumentieren, auch in --help
Nachrichten.
Denken Sie daran , dass auf POSIX die Schale ist Globbing Argumente ( vor Ihrem Programm läuft!), So vermeiden Zeichen erfordern (wie *
oder $
oder ~
) in Optionen , die Shell-escaped sein müsste.
In einigen Fällen können Sie einen Interpreter wie GNU Guile oder Lua in Ihre Software einbinden (vermeiden Sie es, Ihre eigene Turing-complete- Skriptsprache zu erfinden, wenn Sie keine Experten für Programmiersprachen sind). Dies hat tiefgreifende Konsequenzen für das Design Ihrer Software (sollte also frühzeitig bedacht werden!). Sie sollten dann problemlos in der Lage sein, ein Skript oder einen Ausdruck an diesen Interpreter zu übergeben. Wenn Sie diesen interessanten Ansatz wählen, sollten Sie Ihre Software und ihre interpretierten Grundelemente sorgfältig entwerfen. Sie könnten einige seltsame Benutzer haben, die große Skripte für Ihr Ding programmieren.
In anderen Fällen möchten Sie Ihre fortgeschrittenen Benutzer möglicherweise ihr Plugin in Ihre Software laden lassen (unter Verwendung dynamischer Ladetechniken à la dlopen
& dlsym
). Auch dies ist eine sehr wichtige Entwurfsentscheidung (also definieren und dokumentieren Sie die Plugin-Oberfläche sorgfältig), und Sie müssen eine Konvention definieren, um Programmoptionen an diese Plugins zu übergeben.
Wenn Ihre Software komplex ist, lassen Sie sie einige Konfigurationsdateien akzeptieren (zusätzlich oder anstelle von Programmargumenten) und haben möglicherweise die Möglichkeit, diese Konfigurationsdateien zu testen (oder nur zu analysieren), ohne den gesamten Code auszuführen. Beispielsweise ist ein Mail-Transfer-Agent (wie Exim oder Postfix) ziemlich komplex und es ist nützlich, ihn "halbtrocken" auszuführen (z. B. zu beobachten, wie er mit einer bestimmten E-Mail-Adresse umgeht, ohne tatsächlich eine E-Mail zu senden).
Beachten Sie, dass dies /option
eine Windows- oder VMS-Sache ist. Auf POSIX-Systemen wäre dies verrückt (da die Dateihierarchie /
einen Verzeichnisseparator verwendet und die Shell das Globbing ausführt). Meine Antwort ist hauptsächlich für Linux (und POSIX).
PS Wenn möglich, machen Sie Ihr Programm zu einer kostenlosen Software , Sie würden Verbesserungen von einigen Benutzern und Entwicklern erhalten (und das Hinzufügen einer neuen Programmoption ist oft eines der einfachsten Dinge, die Sie zu einer vorhandenen kostenlosen Software hinzufügen können). Auch hängt Ihre Frage viel von dem beabsichtigten Publikum : ein Spiel für Jugendliche oder ein Browser für Oma wahrscheinlich nicht die gleiche Art und Menge von Optionen als ein Compiler benötigt, oder einen Netzwerk - Inspektoren für Rechenzentrum sysadmins oder eine CAD - Software für den Mikroprozessor Architekten oder für Brückenbauer. Ein Ingenieur, der mit Programmieren und Skripten vertraut ist, mag wahrscheinlich viel mehr einstellbare Optionen als Ihre Oma und möchte möglicherweise Ihre Anwendung ohne X11 ausführen können (möglicherweise in einem crontab
Job).
ls -ltr
, um die Optionen zu kombinieren-l
,-t
und-r
. GNU-Programme erlauben normalerweise auch wortbasierte Optionen mit einem doppelten Bindestrich--reverse
anstelle von-r
. Es gibt andere gängige Konventionen-h
, um Hilfe--
-