getopt_long vs getopt_long_only

时间:2010-02-03 14:29:58

标签: linux unix getopt getopt-long

要做一个正确的Linux / unix样式的应用程序,最好的选择是什么(例如,afaik ls 使用getopt_long但是例如 ffmpeg getopt_long_only)。 你推荐哪一个?

干杯,

4 个答案:

答案 0 :(得分:5)

在我看来,通常情况如下:

  • 用户喜欢长而自然的语言选择,因为它们易于记忆。
  • 编写脚本以包装具有数百个选项的程序的用户喜欢简短的选项。

如果一个程序变得足够大,它最终会耗尽短的选项组合,与规范选项相比,这些组合具有任何意义。例如,-Z可能与以完全不同的字母开头的长选项相同。那时,特别是对于单个维护者来说,解析代码的选项变得很难维护。

发生这种情况时你会有几个选择:

  • 使用gengetopt之类的内容从模板中为您编写代码
  • 只使用长选项(通常是个坏主意)
  • 尝试将程序保持在52个选项(a-z A-Z)(通常是一个坏主意)
  • 实现选项,其中短选项只是变为不接受参数的开关,对那些执行
  • 的选项使用长选项
  • 一系列对你来说很有意义且对用户没什么感觉的方法

在不同的场所混合,你真的开始抓住痛苦。

当我坐下来编写一个需要很多选项的工具时,我通常要做的第一件事就是编写代码来解析参数,这有助于规划程序的流程并成为一个大纲。您只需在此之后使每个选项都有效。

换句话说,如果你达到选项变成如此慢性痛苦的程度,它通常表明一个程序很快就会超出其计划的范围。

无论如何,为了结束我的冗长回答,通常最好尽可能保持compat getopt()行为。获取用户指示的代码只是开展业务的成本,因此您应该尽可能完全关注什么能够带来更好的用户体验。

答案 1 :(得分:2)

我会说“正确的gnu / linux风格”你应该使用getopt_long()并为大多数选项提供长选项(有时只提供长选项)。大多数命令行界面都遵循这一点。

答案 2 :(得分:1)

都不是。用户是argp_parse或libpopt。

答案 3 :(得分:0)

我从来没有使用过getopt_long_only,但似乎它必须进行更多的查找,因为如果一个未知标志以单个-开头,它必须查看长和短选项:

  

如果选项以' - '开头(不是   ' - ')与长选项不匹配,但是   确实匹配一个简短的选项,它是   相反,它被解析为一个短选项。

- man getopt_long_only