在POSIX系统(例如Linux,MacOSX)上,至少对于可能在Shell终端中启动的程序(例如其中的大多数),我建议使用GNU编码约定(还列出了常用的参数名称),并查看POSIX实用程序指南,即使是专有软件:
总是处理--version
和--help
(甚至/bin/true
接受它们!)。我诅咒软件作者不理解--help
,我讨厌他们(因为这prog --help
是我在新程序上尝试的第一个命令)!通常--help
可以缩写为-h
使--help
消息列出所有选项(除非您有太多的选择...在这种情况下,列出最常见的选项并显式引用某些man
页面或某些URL)和选项的默认值,并且可能是重要的(且特定于程序) ) 环境变量。在选项参数错误时显示这些选项列表。
接受-a
简短的论点(单字母)并具有一些等效项--long-argument
,因此-a2
--long-argument=2
,--long-argument 2
;; 当然,您可以(对于很少使用的选项)使用一些--only-long-argument
名称;对于没有额外选项的模态参数,-cf
通常会以-c -f
等方式处理,因此您的-argument:value
建议很奇怪,我不建议您这样做。
使用GLIBC getopt_long或更好(例如argp_parse,在OCaml中是Arg
模块,...)
经常使用-
标准输入或输出(如果你不能做到这一点,处理/dev/stdin
和/dev/stdout
甚至在一些操作系统没有他们)
通过重用它们的大多数选择约定来模仿相似程序的行为;特别是-n
对于空转(àla make
),-h
寻求帮助,-v
冗长等...
使用--
作为选项-文件或其他参数之间的分隔符
如果您的程序用于isatty
测试而不是stdin是终端(并且在这种情况下表现为“交互”),则提供一个选项来强制非交互模式,同样,如果您的程序具有GUI界面(并getenv("DISPLAY")
在X11桌面上进行测试),但也可以用于批处理或命令行。
一些程序(例如gcc
)接受间接参数列表,所以@somefile.txt
从中读取程序参数的含义也是如此somefile.txt
。当你的程序可能会接受一个非常大的很多参数,这可能是有用的(超过你的内核ARG_MAX
)
顺便说一句,您甚至可以为程序和常规shell(如bash
或zsh
)添加一些自动完成功能
一些旧的Unix命令(例如dd
,甚至sed
)具有奇怪的命令参数以实现历史兼容性。我建议不要遵循他们的坏习惯(除非您对它们进行了一些改进)。
如果你的软件是一系列相关的命令行程序的,采取从灵感混帐(这你一定作为开发工具使用),它接受git help
和git --help
并有许多git
subcommand
和git
subcommand
--help
在极少数情况下,您可能还会使用argv[0]
(通过在程序上使用符号链接),例如,bash
由于rbash
具有不同的行为(受限制的 shell)而被调用。但是我通常不建议这样做;如果可以使用shebang将您的程序用作脚本解释器,即#!
在execve(2)解释的第一行上,那可能就有意义。如果您使用这些技巧,请确保将它们记录下来,包括在--help
消息中。
请记住,在POSIX上,外壳程序会遍历参数(在运行程序之前!),因此请避免在需要转义外壳程序的选项中要求使用字符(例如*
或$
或~
)。
在某些情况下,您可以在软件中嵌入诸如GNU guile或Lua之类的解释器(如果您不是编程语言专家,请避免发明自己的图灵完整脚本语言)。这会对软件的设计产生深远的影响(因此应尽早考虑!)。然后,您应该可以轻松地将某些脚本或某些表达式传递给该解释器。如果您采用这种有趣的方法,请谨慎设计软件及其解释的原语;您可能会有一些奇怪的用户为您的事情编写大型脚本。
在其他情况下,您可能希望让高级用户将其插件加载到您的软件中(使用动态加载技术àla dlopen
&dlsym
)。同样,这是一个非常重要的设计决策(因此,请谨慎定义和记录插件接口),并且您需要定义一个约定以将程序选项传递给这些插件。
如果您的软件比较复杂,请使其接受某些配置文件(附加或替换程序参数),并且可能有某种方法可以测试(或只是解析)这些配置文件而无需运行所有代码。例如,邮件传输代理(例如Exim或Postfix)非常复杂,能够“半干”运行它(例如观察它如何处理某些给定的电子邮件地址而不实际发送电子邮件)很有用。
注意,这/option
是Windows或VMS。在POSIX系统上这太疯狂了(因为文件层次结构/
用作目录分隔符,并且因为shell会进行globbing)。我所有的答案主要是针对Linux(和POSIX)的。
PS:如果可能的话,使您的程序成为免费软件,您会从某些用户和开发人员那里得到改进(添加新程序选项通常是添加到现有免费软件中最容易的事情之一)。此外,你的问题取决于很多的目标受众:青少年游戏或奶奶的浏览器可能并不需要相同种类和比一个编译器选项量,或用于数据中心的系统管理员的网络检查员,或微处理器CAD软件建筑师或桥梁设计师。熟悉编程和脚本的工程师可能比祖母更喜欢具有许多可调选项,并且可能希望能够在没有X11的情况下运行您的应用程序(也许正在crontab
工作)。
ls -ltr
在选项组合-l
,-t
和-r
。GNU样式程序通常还允许基于单词的选项使用双连字符,例如--reverse
代替-r
。还有其他流行的约定,例如-h
显示帮助,--
表示选项结束,指定-
为文件名以允许从stdin读取等