Em sistemas POSIX (por exemplo, Linux, MacOSX), pelo menos para programas possivelmente iniciados em um terminal shell (por exemplo, a maioria deles), eu recomendaria o uso das convenções de codificação GNU (que também listam nomes de argumentos comuns) e consulte as diretrizes dos utilitários do POSIX , mesmo para software proprietário:
sempre manuseie --version
e--help
(até os /bin/true
aceite !!). Eu amaldiçoo os autores de software que não entendem --help
, eu os odeio (porque prog --help
é o primeiro comando que estou tentando em um novo programa)! Muitas vezes, --help
pode ser abreviado como-h
Faça com que a --help
mensagem liste todas as opções (a menos que você tenha muitas delas ... nesse caso, liste as mais comuns e se refira explicitamente a alguma man
página ou URL) e valores padrão de opções, e talvez importantes (e específicos do programa ) variáveis ambientais. Mostre essas listas de opções no erro de argumento da opção.
aceitar -a
argumento curto (única letra) e ter algum equivalente --long-argument
, então -a2
--long-argument=2
, --long-argument 2
; é claro que você pode ter (para opções raramente usadas) algum --only-long-argument
nome; para argumentos modais sem opções extras -cf
geralmente é tratado como -c -f
etc., portanto, sua -argument:value
proposta é estranha e eu não recomendo fazer isso.
usar GLIBC getopt_long ou melhor (por exemplo argp_parse , em OCaml é Arg
módulo , ...)
geralmente use -
para entrada ou saída padrão (se você não puder fazer isso, manipule /dev/stdin
e /dev/stdout
até nos poucos sistemas operacionais que não os possuem)
imitar o comportamento de programas similares, reutilizando a maioria de suas convenções de opções; em particular -n
para corrida a seco (à la make
), -h
ajuda, -v
verbosidade, etc ...
use --
como separador entre opções e arquivo ou outros argumentos
se o seu programa usa isatty
para testar se stdin é um terminal (e se comportar "interativamente" nesse caso), forneça uma opção para forçar o modo não interativo, da mesma forma se o seu programa tiver uma interface GUI (e for testada getenv("DISPLAY")
na área de trabalho do X11), mas também puder ser usado em lote ou linha de comando.
Alguns programas (por exemplo gcc
) aceitam listas de argumentos indiretos, o que @somefile.txt
significa ler argumentos do programa em somefile.txt
; isso pode ser útil quando seu programa pode aceitar muitos argumentos (mais que os do seu kernel ARG_MAX
)
BTW, você pode até adicionar alguns recursos de preenchimento automático para o seu programa e shells habituais (como bash
ou zsh
)
Alguns comandos antigos do Unix (por exemplo dd
, ou mesmo sed
) têm argumentos de comando estranhos para compatibilidade histórica. Eu recomendaria não seguir seus maus hábitos (a menos que você esteja fazendo uma variante melhor deles).
Se o seu software é uma série de programas de linha de comando relacionados, ter inspiração de git (que você certamente usar como uma ferramenta de desenvolvimento), que aceita git help
e git --help
e têm muitos git
subcommand
egit
subcommand
--help
Em casos raros, você também pode usar argv[0]
(usando links simbólicos no seu programa), por exemplo, bash
invocado por rbash
ter um comportamento diferente ( shell restrito ). Mas eu geralmente não recomendo fazer isso; pode fazer sentido se o seu programa puder ser usado como intérprete de script usando shebang, isto é, #!
na primeira linha interpretada por execve (2) . Se você fizer esses truques, certifique-se de documentá-los, inclusive nas --help
mensagens.
Lembre-se de que, no POSIX, o shell apresenta argumentos esquisitos ( antes de executar seu programa!), Portanto, evite exigir caracteres (como *
ou $
ou ~
) em opções que precisariam ser escapadas do shell.
Em alguns casos, você pode incorporar um intérprete como GNU guile ou Lua em seu software (evite inventar sua própria linguagem de script Turing-completa se você não for especialista em linguagens de programação). Isso tem profundas conseqüências no design do seu software (por isso, deve-se pensar no início!). Você deve passar facilmente algum script ou expressão para esse intérprete. Se você adotar essa abordagem interessante, projete seu software e suas primitivas interpretadas com cuidado; você pode ter um usuário estranho codificando grandes scripts para sua coisa.
Em outros casos, convém permitir que usuários avançados carreguem seus plug - ins no software (usando técnicas de carregamento dinâmico à la dlopen
& dlsym
). Novamente, essa é uma decisão de design muito importante (portanto, defina e documente a interface do plug-in com cuidado) e você precisará definir uma convenção para passar as opções do programa para esses plug-ins.
Se o seu software for algo complexo, aceite alguns arquivos de configuração (além ou substitua os argumentos do programa) e provavelmente tenha alguma maneira de testar (ou apenas analisar) esses arquivos de configuração sem executar todo o código. Por exemplo, um agente de transferência de correio (como Exim ou Postfix) é bastante complexo e é útil poder executá-lo "pela metade" (por exemplo, observar como ele está lidando com um determinado endereço de email sem realmente enviar um email).
Observe que /option
é uma coisa do Windows ou VMS. Seria insano em sistemas POSIX (porque a hierarquia de arquivos usa /
como um separador de diretório e porque o shell faz o globbing). Toda a minha resposta é principalmente para Linux (e POSIX).
PS Se possível, torne seu programa um software livre , você obterá melhorias de alguns usuários e desenvolvedores (e adicionar uma nova opção de programa geralmente é uma das coisas mais fáceis de se adicionar a um software livre existente). Além disso, sua pergunta depende muito do público - alvo : um jogo para adolescentes ou um navegador para a avó provavelmente não precisa do mesmo tipo e quantidade de opções que um compilador, ou um inspetor de rede para administradores de sistemas de datacenter ou um software CAD para microprocessador arquitetos ou para projetistas de pontes. Um engenheiro familiarizado com programação e script provavelmente gosta muito mais de ter muitas opções ajustáveis do que a sua avó e provavelmente pode querer executar seu aplicativo sem o X11 (talvez em um crontab
emprego).
ls -ltr
para combinar as opções-l
,-t
e-r
. Os programas no estilo GNU também geralmente permitem opções baseadas em palavras com um hífen duplo como em--reverse
vez de-r
. Há outras convenções populares como-h
para mostrar a ajuda,--
para sinalizar o final de opções, especificando-
como um nome de arquivo para permitir a leitura de stdin, etc.