En los sistemas POSIX (p. Ej., Linux, MacOSX), al menos para los programas posiblemente iniciados en un terminal de shell (p. Ej., La mayoría de ellos), recomendaría usar las convenciones de codificación de GNU (que también enumeran nombres de argumentos comunes) y consultar las pautas de utilidades POSIX , incluso para software propietario:
siempre maneja --version
y--help
(¡incluso los /bin/true
acepta!). ¡Maldigo a los autores del software que no entienden --help
, los odio (porque prog --help
es el primer comando que estoy probando en un nuevo programa)! A menudo --help
se puede abreviar como-h
Haga que el --help
mensaje enumere todas las opciones (a menos que tenga demasiadas de ellas ... en ese caso enumere las más comunes y consulte explícitamente alguna man
página o alguna URL) y los valores predeterminados de las opciones, y quizás importantes (y específicos del programa ) Variables de entorno. Mostrar estas listas de opciones en el error de argumento de opción.
aceptar -a
el argumento corto (de una sola letra) y tienen algún equivalente --long-argument
, por lo que -a2
--long-argument=2
, --long-argument 2
; por supuesto, podría tener (para opciones poco utilizadas) algún --only-long-argument
nombre; para argumentos modales sin opciones adicionales -cf
generalmente se maneja como -c -f
, etc., por lo que su -argument:value
propuesta es extraña, y no recomiendo hacerlo.
use GLIBC getopt_long o mejor (por ejemplo , argp_parse , en OCaml es un Arg
módulo , ...)
a menudo se usa -
para entrada o salida estándar (si no puede hacerlo, maneje /dev/stdin
e /dev/stdout
incluso en los pocos sistemas operativos que no los tienen)
imitar el comportamiento de programas similares reutilizando la mayoría de sus convenciones de opciones; en particular -n
para funcionamiento en seco (à la make
), -h
para ayuda, -v
para verbosidad, etc.
utilizar --
como separador entre opciones y archivo u otros argumentos
si su programa usa isatty
para probar que stdin es un terminal (y se comporta "interactivamente" en ese caso), proporcione una opción para forzar el modo no interactivo, del mismo modo si su programa tiene una interfaz GUI (y prueba getenv("DISPLAY")
en el escritorio X11) pero también podría ser utilizado en lote o línea de comando.
Algunos programas (p gcc
. Ej. ) Aceptan listas de argumentos indirectos, por @somefile.txt
lo que significa leer los argumentos del programa somefile.txt
; Esto podría ser útil cuando su programa acepte una gran cantidad de argumentos (más que los de su núcleo ARG_MAX
)
Por cierto, incluso podría agregar algunas instalaciones de autocompletar para su programa y shells habituales (como bash
o zsh
)
Algunos comandos antiguos de Unix (por ejemplo dd
, o incluso sed
) tienen argumentos de comando extraños para compatibilidad histórica. Recomendaría no seguir sus malos hábitos (a menos que esté haciendo una mejor variante de ellos).
Si el software es una serie de programas de línea de comandos relacionados, tomar la inspiración de GIT (que utiliza tanta seguridad como una herramienta de desarrollo), que acepta git help
y git --help
y tienen muchos git
subcommand
ygit
subcommand
--help
En casos excepcionales, también puede usar argv[0]
(mediante el uso de enlaces simbólicos en su programa), por ejemplo, bash
invocado ya que rbash
tiene un comportamiento diferente ( shell restringido ). Pero generalmente no recomiendo hacer eso; podría tener sentido si su programa pudiera usarse como un intérprete de script usando shebang, es decir, #!
en la primera línea interpretada por execve (2) . Si haces tales trucos, asegúrate de documentarlos, incluso en los --help
mensajes.
Recuerde que en POSIX la cáscara se globbing argumentos ( antes de ejecutar el programa!), Así que evite que requieren caracteres (como *
o $
o ~
) en las opciones que necesitan ser cáscara escapado.
En algunos casos, puede incorporar un intérprete como GNU guile o Lua en su software (evite inventar su propio lenguaje de script completo de Turing si no es experto en lenguajes de programación). Esto tiene profundas consecuencias en el diseño de su software (¡por lo tanto, debe pensarlo pronto!). Entonces debería poder pasar fácilmente algún guión o alguna expresión a ese intérprete. Si adopta ese enfoque interesante, diseñe su software y sus primitivas interpretadas con cuidado; podrías tener algún usuario extraño que codifique grandes scripts para tu cosa.
En otros casos, es posible que desee permitir que sus usuarios avanzados carguen su complemento en su software (utilizando técnicas de carga dinámica a la dlopen
& dlsym
). Nuevamente, esta es una decisión de diseño muy importante (así que defina y documente la interfaz del complemento con cuidado), y deberá definir una convención para pasar las opciones del programa a estos complementos.
Si su software es algo complejo, haga que acepte algunos archivos de configuración (además o reemplazo de los argumentos del programa) y probablemente tenga alguna forma de probar (o simplemente analizar) estos archivos de configuración sin ejecutar todo el código. Por ejemplo, un agente de transferencia de correo (como Exim o Postfix) es bastante complejo, y es útil poder ejecutarlo "a medias" (por ejemplo, observar cómo maneja alguna dirección de correo electrónico dada sin enviar un correo electrónico).
Tenga en cuenta que /option
es una cosa de Windows o VMS. Sería una locura en los sistemas POSIX (porque la jerarquía de archivos se usa /
como un separador de directorio y porque el shell hace el globing). Toda mi respuesta es principalmente para Linux (y POSIX).
PD: Si es posible, convierta su programa en un software gratuito , obtendrá mejoras de algunos usuarios y desarrolladores (y agregar una nueva opción de programa es a menudo una de las cosas más fáciles de agregar a un software gratuito existente). Además, su pregunta depende mucho de la audiencia prevista : un juego para adolescentes o un navegador para la abuela probablemente no necesite el mismo tipo y cantidad de opciones que un compilador, o un inspector de red para los administradores de centros de datos, o un software CAD para microprocesador arquitectos o para diseñadores de puentes. Un ingeniero familiarizado con la programación y las secuencias de comandos probablemente le guste mucho más tener muchas opciones ajustables que su abuela, y probablemente quiera ejecutar su aplicación sin X11 (tal vez en un crontab
trabajo).
ls -ltr
para combinar las opciones-l
,-t
y-r
. Los programas de estilo GNU también suelen permitir opciones basadas en palabras con un guión doble como en--reverse
lugar de-r
. Hay otras convenciones populares como-h
mostrar ayuda,--
señalar el final de las opciones, especificar-
un nombre de archivo para permitir la lectura de stdin, etc.