Sur les systèmes POSIX (par exemple Linux, MacOSX), du moins pour les programmes éventuellement démarrés dans un terminal shell (par exemple, la plupart d'entre eux), je recommanderais d'utiliser les conventions de codage GNU (qui répertorie également les noms d'arguments courants) et de consulter les instructions relatives aux utilitaires POSIX. , même pour les logiciels propriétaires:
toujours manipuler --version
et--help
(même les /bin/true
accepte !!). Je maudis les auteurs de logiciels qui ne comprennent pas --help
, je les déteste (car prog --help
c'est la première commande que j'essaye d'un nouveau programme)! Souvent, --help
peut être abrégé en-h
Demandez au --help
message de répertorier toutes les options (sauf si vous en avez trop ... dans ce cas, listez les plus courantes et référez-vous explicitement à une man
page ou à une URL) et aux valeurs par défaut des options, et peut-être important (et spécifique au programme). ) Variables d'environnement. Afficher ces listes d'options en cas d'erreur d'argument.
accepter l' -a
argument court (lettre simple) et avoir un équivalent --long-argument
, donc -a2
--long-argument=2
, --long-argument 2
; bien sûr, vous pourriez avoir (pour les options rarement utilisées) un --only-long-argument
nom; pour les arguments modaux sans options supplémentaires -cf
est généralement traité comme -c -f
, etc., donc votre -argument:value
proposition est étrange, et je ne recommande pas de le faire.
utilisez GLIBC getopt_long ou mieux (par exemple, argp_parse , dans OCaml c'est son Arg
module , ...)
utilisez souvent -
pour une entrée ou une sortie standard (si vous ne pouvez pas faire cela, manipulez /dev/stdin
et /dev/stdout
même sur les rares systèmes d'exploitation qui n'en ont pas)
imitez le comportement de programmes similaires en réutilisant la plupart de leurs conventions d'options; en particulier -n
pour les essais à sec make
, -h
à l'aide, -v
pour la verbosité, etc ...
utiliser --
comme séparateur entre les options et le fichier ou d'autres arguments
si votre programme utilise isatty
pour tester alors que stdin est un terminal (et se comporte de manière "interactive" dans ce cas), fournissez une option pour forcer le mode non interactif, de même si votre programme dispose d'une interface graphique (et effectue des tests getenv("DISPLAY")
sur le bureau X11), mais peut également être utilisé en batch ou en ligne de commande.
Certains programmes (par exemple gcc
) acceptent les listes d'arguments indirects, ce qui @somefile.txt
signifie que les arguments de programme lus sont lus somefile.txt
; cela peut être utile lorsque votre programme peut accepter un très grand nombre d'arguments (plus que ceux de votre noyau ARG_MAX
)
BTW, vous pouvez même ajouter des fonctionnalités de saisie automatique pour votre programme et les shells habituels (comme bash
ou zsh
)
Certaines anciennes commandes Unix (par exemple dd
, ou même sed
) ont des arguments de commande étranges pour la compatibilité historique. Je recommanderais de ne pas suivre leurs mauvaises habitudes (à moins que vous ne leur donniez une meilleure variante).
Si votre logiciel est une série de programmes de ligne de commande connexes, se inspirer de git (que vous utilisez sûrement comme un outil de développement), qui accepte git help
et git --help
et ont beaucoup git
subcommand
etgit
subcommand
--help
Dans de rares cas, vous pouvez également utiliser argv[0]
(en utilisant des liens symboliques dans votre programme), par exemple bash
invoqué sous rbash
un comportement différent ( shell restreint ). Mais je ne recommande généralement pas de faire cela; il pourrait être judicieux d'utiliser votre programme comme interpréteur de script en utilisant shebang, c'est- #!
à- dire sur la première ligne interprétée par execve (2) . Si vous faites de telles astuces, assurez-vous de les documenter, y compris dans les --help
messages.
Rappelez - vous que sur la POSIX shell est englobement arguments ( avant l' exécution de votre programme!), Donc éviter d' exiger des caractères (comme *
ou $
ou ~
) dans les options qui doivent être coquille échappé.
Dans certains cas, vous pouvez intégrer un interpréteur tel que GNU guile ou Lua dans votre logiciel (évitez d’inventer votre propre langage de script Turing-complete si vous n’êtes pas expert en langages de programmation). Cela a de profondes conséquences sur la conception de votre logiciel (il faut donc y penser tôt!). Vous devriez alors pouvoir facilement passer un script ou une expression à cet interprète. Si vous prenez cette approche intéressante, concevez votre logiciel et ses primitives interprétées avec soin; vous pourriez avoir un utilisateur étrange codant de gros scripts pour votre truc.
Dans d'autres cas, vous pouvez laisser vos utilisateurs avancés charger leur plug-in dans votre logiciel (en utilisant des techniques de chargement dynamiques à la dlopen
& dlsym
). Là encore, il s’agit d’une décision de conception très importante (définissez et documentez donc soigneusement l’interface du plug-in) et vous devrez définir une convention permettant de transmettre les options de programme à ces plug-ins.
Si votre logiciel est complexe, faites-le accepter certains fichiers de configuration (en plus du remplacement des arguments du programme) et possédez probablement un moyen de tester (ou tout simplement d’analyser) ces fichiers de configuration sans exécuter tout le code. Par exemple, un agent de transfert de courrier (comme Exim ou Postfix) est assez complexe et il est utile de pouvoir le "sécher à moitié" (par exemple, observer comment il gère une adresse email donnée sans envoyer réellement d'email).
Notez que le /option
est une chose Windows ou VMS. Ce serait insensé sur les systèmes POSIX (car la hiérarchie des fichiers est utilisée /
comme séparateur de répertoires et parce que le shell effectue la suppression). Toute ma réponse est principalement pour Linux (et POSIX).
PS Si possible, faites de votre programme un logiciel libre , certains utilisateurs et développeurs vous apporteront des améliorations (et ajouter une nouvelle option à un programme est souvent l’une des choses les plus faciles à ajouter à un logiciel libre existant). De plus, votre question dépend beaucoup du public visé : un jeu pour adolescents ou un navigateur pour grand-mère n’a probablement pas besoin du même type et du même nombre d’options qu’un compilateur, ou un inspecteur de réseau pour les systèmes de centre de traitement des données, ou un logiciel de CAO pour un microprocesseur. architectes ou pour les concepteurs de ponts. Un ingénieur familiarisé avec la programmation et les scripts aime probablement beaucoup plus que votre grand-mère d'avoir beaucoup d'options paramétrables, et voudra probablement pouvoir exécuter votre application sans X11 (peut-être dans un crontab
travail).
ls -ltr
pour combiner les options-l
,-t
et-r
. Les programmes de style GNU autorisent également les options basées sur les mots avec un double trait d'union,--reverse
au lieu de-r
. Il existe d'autres conventions populaires comme-h
afficher l'aide,--
signaler la fin des options, spécifier-
un nom de fichier pour autoriser la lecture à partir de stdin, etc.