Parsing 命令行参数/程序选项解析样式和规范?

Parsing 命令行参数/程序选项解析样式和规范?,parsing,command-line-arguments,argparse,boost-program-options,specifications,Parsing,Command Line Arguments,Argparse,Boost Program Options,Specifications,我很好奇是否有任何广泛的概述,最好是关于GNU风格和其他常用的用于解析命令行参数的风格的规范/技术报告 据我所知,有许多捕获,并不是完全微不足道地写一个解析库,它将符合C++的Booo::PythOpType、Python的AgPARSE、GNU-GETOPT等等。 另一方面,可能有一些库在接受某些选项时过于自由或过于限制。因此,如果想要与事实上的标准(如果存在)保持良好的兼容性/一致性,有没有比简单地阅读大量成熟库的源代码和/或测试用例更好的方法呢?Posix提供了实用程序语法的指南,如XBD

我很好奇是否有任何广泛的概述,最好是关于GNU风格和其他常用的用于解析命令行参数的风格的规范/技术报告

据我所知,有许多捕获,并不是完全微不足道地写一个解析库,它将符合C++的Booo::PythOpType、Python的AgPARSE、GNU-GETOPT等等。


另一方面,可能有一些库在接受某些选项时过于自由或过于限制。因此,如果想要与事实上的标准(如果存在)保持良好的兼容性/一致性,有没有比简单地阅读大量成熟库的源代码和/或测试用例更好的方法呢?

Posix提供了实用程序语法的指南,如XBD(基本定义)。这当然值得一读。如前所述,向后兼容性意味着许多标准化的实用程序不符合这些指南,但标准建议

。。。所有未来的实用程序和应用程序都使用这些准则来增强用户的可移植性。某些历史实用程序无法更改(以避免破坏现有应用程序)这一事实不应阻止这一未来目标

您还可以阅读以了解语法指南

Posix提供了一个基本语法,但对于具有大量参数的实用程序来说,它是不够的,而且单字母选项在自我文档中有点缺乏。一些实用程序--
test
find
tcpdump
浮现在脑海中--基本上实现了特定于领域的语言。其他的--
ls
ps
,例如,拥有令人困惑的调用选项。更不用说编译器了

多年来,已经考虑了许多可能的扩展方法,并且可能所有的扩展方法仍在至少一个通用(甚至可能是标准)实用程序中使用。Posix建议使用
-W
作为一种扩展机制,但很少使用这种机制。X Windows和TCL/Tk普及了拼写多字符选项的使用,但这些实用程序希望长选项名称仍然以一个破折号开头,这使得压缩非参数选项变得不可能[注1]。其他实用程序--
dd
make
awk
,举几个例子--特殊情况参数,其形式为
{íd}={val}
,完全没有连字符。使用双连字符的GNU方法似乎在很大程度上取得了胜利,部分原因在于此,但GNU风格的选项重新排序并没有得到普遍的认可

GNU中有一个关于GNU风格的简短讨论(另请参见),Eric Raymond的[注2]中有一个稍微不那么简短的讨论

谷歌代码将命令行选项提升到了一个新的水平;内部库现在是开源的,所以我想现在观察Google的服务器管理工具有多少是通过命令行选项完成的,这并没有破坏机密性。Google标志不分青红皂白地散布在代码中,这样库函数就可以定义自己的选项,而调用程序根本不知道这些选项,从而可以独立于应用程序定制关键库的行为。(还可以在运行时动态修改gflag的值,这是服务管理的另一个有趣的工具。)从语法角度来看,
gflags
允许不分青红皂白地显示单字符和双字符长选项,并且不允许合并单字符选项调用。[注3]

值得强调的是,在Unix编程环境(Kernighan&Pike)中观察到的一点是,由于shell“必须同时满足命令执行的交互和编程方面,它是一种奇怪的语言,既受历史的影响,也受设计的影响。”这两个方面的需求——简洁的交互语言和精确的编程语言的需求——并不总是兼容的

语法灵活性虽然对交互式用户很方便,但对脚本作者来说可能是灾难性的。例如,昨晚我输入了
-env=…
而不是
--env=…
,这导致我将
nv=…
传递到
-e
选项,而不是将
..
传递到
--env
选项,直到有人问我为什么要传递那个奇怪的字符串作为EOF指示器,我才注意到这一点。另一方面,我最讨厌的是一些人更喜欢
--long option
,而另一些人更喜欢
--long\u option
,有时你会在同一个程序中发现这两种风格(我看着你),这对于交互用户和脚本编写者来说同样令人讨厌

可悲的是,我不知道有什么资源可以作为这个问题的答案,我也不确定上述资源是否满足需要。但也许我们可以随着时间的推移加以改进


注意事项:

  • 显然这是一个坏主意,因为这将使构建有用的
    netstat
    调用(其参数为可读单词)成为不可能

  • 这本书和它的作者通常分别被称为陶普和ESR

  • 我花了一段时间才习惯,几乎没有时间恢复我的旧习惯。所以你可以看到我的偏见所在