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 --versionet--help (même les /bin/trueaccepte !!). 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, --helppeut être abrégé en-h
Demandez au --helpmessage 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 manpage 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' -aargument 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-argumentnom; pour les arguments modaux sans options supplémentaires -cfest généralement traité comme -c -f, etc., donc votre -argument:valueproposition 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 Argmodule , ...)
utilisez souvent -pour une entrée ou une sortie standard (si vous ne pouvez pas faire cela, manipulez /dev/stdinet /dev/stdoutmê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 -npour les essais à sec make, -hà l'aide, -vpour la verbosité, etc ...
utiliser --comme séparateur entre les options et le fichier ou d'autres arguments
si votre programme utilise isattypour 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.txtsignifie 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 bashou 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 helpet git --helpet ont beaucoup gitsubcommandetgitsubcommand--help
Dans de rares cas, vous pouvez également utiliser argv[0](en utilisant des liens symboliques dans votre programme), par exemple bashinvoqué sous rbashun 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 --helpmessages.
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 /optionest 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 crontabtravail).
ls -ltrpour combiner les options-l,-tet-r. Les programmes de style GNU autorisent également les options basées sur les mots avec un double trait d'union,--reverseau lieu de-r. Il existe d'autres conventions populaires comme-hafficher l'aide,--signaler la fin des options, spécifier-un nom de fichier pour autoriser la lecture à partir de stdin, etc.