【问题标题】:getopt_long vs getopt_long_onlygetopt_long 与 getopt_long_only
【发布时间】:2010-02-03 14:29:57
【问题描述】:

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

干杯,

【问题讨论】:

    标签: linux unix getopt getopt-long


    【解决方案1】:

    在我看来,以下几点通常是正确的:

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

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

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

    • 使用 gengetopt 之类的东西从模板中为您编写代码
    • 只使用长选项(通常是个坏主意)
    • 尝试将程序减少到 52 个选项 (a-z A-Z)(通常是个坏主意)
    • 在短选项变成不带参数的开关的情况下实现选项,对带参数的选项使用长选项
    • 一连串其他方法对您来说非常有意义,而对用户却毫无意义

    混合在不同的语言环境中,你就真正开始掌握痛苦了。

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

    换句话说,如果您到了选择成为一种长期痛苦的地步,这通常表明该计划的发展迅速超出了其计划。

    无论如何,要结束我冗长的回答,通常最好尽可能保持兼容的 getopt() 行为。从用户那里获得指令的代码只是做生意的成本,所以你应该完全关注什么可以带来更好的用户体验,如果可能的话。

    【讨论】:

    • 我快速浏览了一下 gengetopt,我只会将它用于具有 lot 选项的程序..
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      两者都没有。使用 argp_parse 或 libpopt。

      【讨论】:

      • argp_parse 比 getopt_long 有什么优势?
      【解决方案4】:

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

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

      -- man getopt_long_only

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        相关资源
        最近更新 更多