Sui sistemi POSIX (ad es. Linux, MacOSX), almeno per i programmi eventualmente avviati in un terminale shell (ad es. La maggior parte di essi), consiglierei di utilizzare le convenzioni di codifica GNU (che elenca anche nomi di argomenti comuni) e di consultare le linee guida sulle utility POSIX , anche per software proprietario:
gestisci sempre --version
e--help
(anche /bin/true
li accetta !!). Maledico gli autori di software che non capiscono --help
, li odio (perché prog --help
è il primo comando che sto provando su un nuovo programma)! Spesso --help
può essere abbreviato come-h
Chiedi al --help
messaggio di elencare tutte le opzioni (a meno che tu non ne abbia troppe ... in quel caso elenca le più comuni e fai esplicito riferimento a qualche man
pagina o qualche URL) e ai valori predefiniti delle opzioni, e forse importanti (e specifici del programma ) variabili ambientali. Mostra questi elenchi di opzioni sull'errore dell'argomento opzione.
accettare -a
breve argomento (singola lettera) e avere qualche equivalente --long-argument
, così -a2
--long-argument=2
, --long-argument 2
; ovviamente potresti avere (per opzioni usate raramente) un --only-long-argument
nome; per argomenti modali senza opzioni extra -cf
è generalmente gestito come -c -f
, ecc. quindi la tua -argument:value
proposta è strana e non ti consiglio di farlo.
usa GLIBC getopt_long o meglio (es. argp_parse , in OCaml è il Arg
modulo , ...)
spesso usano -
per input o output standard (se non puoi farlo, gestisci /dev/stdin
e /dev/stdout
anche sui pochi sistemi operativi che non li hanno)
imitare il comportamento di programmi simili riutilizzando la maggior parte delle convenzioni sulle opzioni; in particolare -n
per la corsa a secco (à la make
), -h
per aiuto, -v
per verbosità, ecc ...
utilizzare --
come separatore tra opzioni e file o altri argomenti
se il tuo programma usa isatty
per testare che stdin è un terminale (e si comporta "interattivamente" in quel caso), fornisci un'opzione per forzare la modalità non interattiva, allo stesso modo se il tuo programma ha un'interfaccia GUI (e test getenv("DISPLAY")
sul desktop X11) ma potrebbe anche essere utilizzato in batch o riga di comando.
Alcuni programmi (ad es. gcc
) Accettano liste di argomenti indiretti, quindi @somefile.txt
significa leggere argomenti del programma da somefile.txt
; questo potrebbe essere utile quando il tuo programma potrebbe accettare molti argomenti (più di quelli del tuo kernel ARG_MAX
)
A proposito, potresti persino aggiungere alcune funzionalità di completamento automatico per il tuo programma e le solite shell (come bash
o zsh
)
Alcuni vecchi comandi Unix (ad esempio dd
, o anche sed
) hanno strani argomenti di comando per la compatibilità storica. Consiglierei di non seguire le loro cattive abitudini (a meno che non ne stiate facendo una variante migliore).
Se il tuo software è una serie di programmi a riga di comando correlati, prendi ispirazione da git (che sicuramente utilizzerai come strumento di sviluppo), che accetta git help
e git --help
che ha molti git
subcommand
egit
subcommand
--help
In rari casi potresti anche usare argv[0]
(usando i collegamenti simbolici sul tuo programma), ad esempio bash
invocato perché rbash
ha un comportamento diverso ( shell limitata ). Ma di solito non consiglio di farlo; potrebbe avere senso se il tuo programma potesse essere usato come interprete di script usando shebang, cioè #!
sulla prima riga interpretata da execve (2) . Se fai questi trucchi, assicurati di documentarli, anche nei --help
messaggi.
Si ricorda che sul POSIX la shell è globbing argomenti ( prima esecuzione del programma!), In modo da evitare che richiedono caratteri (come *
o $
o ~
) nelle opzioni, che avrebbe bisogno di essere shell escape.
In alcuni casi, potresti incorporare un interprete come GNU guile o Lua nel tuo software (evita di inventare il tuo linguaggio di scripting completo di Turing se non sei esperto in linguaggi di programmazione). Ciò ha profonde conseguenze sulla progettazione del tuo software (quindi dovresti pensarci presto!). Dovresti quindi essere in grado di passare facilmente qualche script o espressione a quell'interprete. Se segui questo approccio interessante, progetta con cura il tuo software e le sue primitive interpretate; potresti avere degli strani utenti che codificano grandi script per te.
In altri casi, potresti voler consentire ai tuoi utenti esperti di caricare i loro plugin nel tuo software (usando tecniche di caricamento dinamico à la dlopen
& dlsym
). Ancora una volta, questa è una decisione di progettazione molto importante (quindi definisci e documenta con cura l'interfaccia del plug-in) e dovrai definire una convenzione per passare le opzioni del programma a questi plugin.
Se il tuo software è una cosa complessa, fallo accettare alcuni file di configurazione (in aggiunta o in sostituzione degli argomenti del programma) e probabilmente avrai un modo per testare (o semplicemente analizzare) questi file di configurazione senza eseguire tutto il codice. Ad esempio, un agente di trasferimento di posta (come Exim o Postfix) è piuttosto complesso, ed è utile essere in grado di "eseguirlo a metà" (ad es. Osservando come sta gestendo un determinato indirizzo e-mail senza inviare effettivamente una e-mail).
Si noti che /option
è una cosa Windows o VMS. Sarebbe folle sui sistemi POSIX (perché la gerarchia di file utilizza /
come separatore di directory e perché la shell fa il globbing). Tutta la mia risposta è principalmente per Linux (e POSIX).
PS Se possibile, rendi il tuo programma un software gratuito , otterrai miglioramenti da alcuni utenti e sviluppatori (e l'aggiunta di una nuova opzione di programma è spesso una delle cose più facili da aggiungere a un software gratuito esistente). Inoltre, la tua domanda dipende molto dal pubblico previsto : un gioco per adolescenti o un browser per la nonna probabilmente non richiedono lo stesso tipo e la stessa quantità di opzioni di un compilatore o un ispettore di rete per amministratori di sistemi di dati o un software CAD per microprocessore architetti o per progettisti di ponti. Un ingegnere che ha familiarità con la programmazione e gli script probabilmente ama molto di più avere molte opzioni sintonizzabili rispetto a tua nonna, e probabilmente potrebbe voler essere in grado di eseguire l'applicazione senza X11 (forse in un crontab
lavoro).
ls -ltr
per combinare le opzioni-l
,-t
e-r
. I programmi in stile GNU in genere consentono anche opzioni basate su parole con un doppio trattino come--reverse
invece di-r
. Esistono altre convenzioni popolari come-h
mostrare aiuto,--
segnalare la fine delle opzioni, specificando-
come nome file per consentire la lettura da stdin, ecc.