【问题标题】:Is there a "standard" format for command line/shell help text?命令行/shell帮助文本是否有“标准”格式?
【发布时间】:2012-04-01 07:29:10
【问题描述】:

如果没有,是否有事实上的标准?基本上我正在编写这样的命令行帮助文本:

usage: app_name [options] required_input required_input2
  options:
    -a, --argument     Does something
    -b required     Does something with "required"
    -c, --command required     Something else
    -d [optlistitem1 optlistitem 2 ... ]     Something with list

我基本上只是通过阅读各种工具的帮助文本来做到这一点的,但是有指南列表之类的吗?例如,我使用方括号还是圆括号?如何使用间距?如果参数是一个列表怎么办?谢谢!

【问题讨论】:

  • 我认为 GNU 有一些提示。我会看看大多数 GNU 实用程序在做什么。
  • @DanielPryden 我认为这个问题的答案有点误导。它提供的链接解释了应该接受哪些开关,而不是--help 的输出应该是什么样子。但这两个问题都适合合并。
  • @pmr:我同意——也许模组可以为我们合并问题。
  • 我会看看大多数 GNU 实用程序在做什么,然后以另一种方式来做。

标签: shell command-line command-line-arguments


【解决方案1】:

GNU 编码标准是这样的一个很好的参考。 This section 处理--help 的输出。在这种情况下,它不是很具体。打印显示短选项和长选项以及简洁描述的表格可能不会出错。尝试使所有参数之间的间距正确以提高可读性。您可能希望为您的工具提供一个man 页面(可能还有一个info 手册)以提供更详细的解释。

【讨论】:

    【解决方案2】:

    是的,你在正确的轨道上。

    是的,方括号是可选项目的常用指示符。

    通常,正如您所勾勒的那样,顶部有一个命令行摘要,然后是详细信息,最好是每个选项都有示例。 (您的示例在每个选项描述之间显示了行,但我认为这是一个编辑问题,并且您的实际程序输出缩进的选项列表,中间没有空行。这将是无论如何都要遵循的标准。)

    一个较新的趋势,(也许有解决这个问题的 POSIX 规范?),是消除用于文档的手册页系统,并将手册页中的所有信息作为program --help 输出的一部分包括在内。此额外内容将包括更长的描述、解释的概念、使用示例、已知限制和错误、如何报告错误,以及可能的相关命令的“另见”部分。

    我希望这会有所帮助。

    【讨论】:

    • 不不不。该命令应该有一个手册页,其中包含完整的详细使用参考,-h|--help 应该只是一个总结参考。您还可以在 HTML 或信息页面中包含更全面的文档(教程等)。但是手册页应该在那里!
    • 我同意你的观点,@ninjalj,但正如我所说,“一种新趋势”,我的意思是我使用的两个系统,UWin 和 MinGW 都带有嵌入式文档。我认为嵌入式文档有它的位置,特别是对于小型用户级脚本,就像这个用户提出的那样。他应该学习nroff和.info吗?但是很高兴让我们保持诚实,感谢您的 cmets 并祝大家好运。
    • 就我个人而言,当我在 shell 中键入 someCommand --help 时,我所需要的只是提醒一下参数输入的精确顺序,而不是填满屏幕的一大段文本,需要我通过管道它进入less 只是为了查看所有内容。手册页应该是您放置详细描述的地方,而不是帮助文本。
    • 据 docopt 的制造者在他的会议上提到,POSIX 对此有一个规范。
    【解决方案3】:

    我会以 tar 等官方项目为例。在我看来帮助味精。需要尽可能简单和具有描述性。使用的例子也很好。没有真正需要“标准帮助”。

    【讨论】:

    • 关于 tar... 如果有人要制作像 tar 这样的万能神器,请让短开关令人难忘,并在 @987654322 中包含“示例用法”部分@。 90% 的时间我看 tar 的说明是为了提取一个简单的tar.gz
    • '没有真正需要“标准帮助”。' 我们使用的大多数东西是否有任何“真正需要”?还是他们只是为了让我们的生活更轻松?有一个一致同意的方式来表示选项不仅对读者有用,而且对例如。将是有用的人建设例如可以控制任意命令行实用程序并希望提供用于设置其选项的控件的 GUI。我可能还没有考虑过更好的用途。
    【解决方案4】:

    通常,您的帮助输出应包括:

    • 应用功能描述
    • 使用语法,其中:
      • 使用[options] 指示选项的位置
      • arg_name 表示必需的单数 arg
      • [arg_name] 用于可选的单数 arg
      • arg_name... 用于需要的 arg,其中可能有很多(这种情况很少见)
      • [arg_name...] 用于可以提供任何数字的 arg
      • 请注意,arg_name 应该是描述性的短名称,小写蛇形
    • 格式精美的选项列表,每个选项:
      • 有简短的描述
      • 显示默认值,如果有的话
      • 显示可能的值(如果适用)
      • 请注意,如果选项可以接受短格式(例如-l)或长格式(例如--list),请将它们一起包含在同一行中,因为它们的描述将相同
    • 可能是命令行参数来源的配置文件或环境变量位置的简要指示符,例如GREP_OPTS
    • 如果有手册页,请注明,否则,简要说明可在何处找到更详细的帮助

    进一步注意,接受-h--help 来触发此消息是一种很好的形式并且如果用户弄乱了命令行语法,您应该显示此消息,例如省略一个必需的参数。

    【讨论】:

    • 如果我有两种形式的单个必需参数怎么办?例如。更标准的说法:usage: move (+|-)pixels 即当+ - 之一是强制? (我知道我可以有 2 条用法线,但我喜欢用每个新参数将它们加倍的想法。)你能想出一个标准工具的例子吗?
    • @AloisMahdal 我通常在 SysV Init/upstart 服务脚本的帮助部分中看到 {a|b|c|...},这需要一个单数参数,它是 abc 等之一. 例如,我的系统上没有参数的service sddm 打印出Usage: /etc/init.d/sddm {start|stop|status|restart|try-restart|force-reload}。所以大多数人可能会理解usage: move {+|-}pixels},尤其是如果给出一个例子:example: move +5
    • @JorgeBucaran 他们不应该以状态 0 退出吗?我相信以状态 2 退出是无效 shell 命令的标准。
    【解决方案5】:

    微软有自己的Command Line Standard specification

    本文档主要面向命令行实用程序的开发人员。总的来说,我们的目标是提供一致的、可组合的命令行用户体验。实现这一点允许用户学习一组核心概念(语法、命名、行为等),然后能够将这些知识转化为使用大量命令。这些命令应该能够以标准化格式输出标准化的数据流,以便轻松组合,而无需解析输出文本流。本文档的编写独立于 shell、实用程序集或命令创建技术的任何特定实现;但是,附录 J - 使用 Windows Powershell 实施 Microsoft 命令行标准展示了如何使用 Windows PowerShell 免费提供其中许多指南的实施。

    【讨论】:

    • 微软对大多数实用程序的命令行帮助都很糟糕,一切都太糟糕了,以至于他们让 Powershell 将“常规”命令行隐藏在地毯下。
    • 我认为答案不应该仅仅因为它引用了微软的标准而被否决。 “一切都如此糟糕”是一种主观意见。同样的,可以说 UNIX 的命令行很糟糕而且丑陋,但是让我们远离这些意见,成为专业人士。
    • 同意,这不是这个答案应该被否决的原因。如果被否决,那应该是因为 a) 被引用的文档部分没有回答手头的问题,并且 b) 链接到的文档似乎不相关。该问题询问是否有“帮助文本”的标准,重点强调用于传达命令用法概要的语法。该文档没有提供这样的语法,而是提供了如何在 PowerShell 生态系统中构建良好的命令行应用程序(例如必须支持-?-Help-Version 等)。 IMO Steely Wing 的答案更接近目标。
    • 但是,正如 steely-wing 已经提到的,微软也有这个更好更简单的文档:docs.microsoft.com/en-us/windows-server/administration/… 另外,MotherDawg 添加了一个指向 POSIX 的链接,它是相同的:pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 和 lily- finley 链接了不错的docopt.org 所以,我不会使用这个复杂的微软文档
    【解决方案6】:

    看看docopt。它是记录(和自动解析)命令行参数的正式标准。

    例如...

    Usage:
      my_program command --option <argument>
      my_program [<optional-argument>]
      my_program --another-option=<with-argument>
      my_program (--either-that-option | <or-this-argument>)
      my_program <repeating-argument> <repeating-argument>...
    

    【讨论】:

      【解决方案7】:

      我们正在运行 Linux,这是一个主要兼容 POSIX 的操作系统。 POSIX 标准应该是:Utility Argument Syntax

      • 选项是一个连字符后跟一个字母数字字符, 像这样:-o
      • 一个选项可能需要一个参数(必须出现 紧接在选项之后);例如,-o argument-oargument
      • 不需要参数的选项可以在连字符后分组,例如,-lst 等价于-t -l -s
      • 选项可以按任意顺序出现;因此-lst 等价于-tls
      • 选项可以出现多次。
      • 选项在其他非选项之前 参数:-lst 非选项。
      • -- 参数终止选项。
      • - 选项通常用于表示标准输入之一 流。

      【讨论】:

      • 在 GNU/Linux 中的使用通常不完全遵循这个标准。运行例如man aptitude 输出这个(除其他外):aptitude [&lt;options&gt;...] {add-user-tag | remove-user-tag} &lt;tag&gt; &lt;packages&gt;...。它包含 { 和 } 来绑定替代的强制命令。我认为 ( 和 ) 可以用于与docopt 中相同的用途。
      • 如果提供的链接失效,这个答案的帮助将大大降低。也许您可以在答案本身中总结链接文档的重要部分?
      • 虽然不太可能,但这个页面也很有可能有一天会下降 :q 只是说。所以复制东西并不是解决死链接问题的真正方法。我们宁愿努力打造一个不那么容易出错的互联网。
      【解决方案8】:

      我认为命令行使用没有标准语法,但大多数都使用这种约定:

      微软Command-Line Syntax,IBM也有类似的Command-Line Syntax


      • Text without brackets or braces

        您必须输入的项目如图所示

      • &lt;Text inside angle brackets&gt;

        您必须为其提供值的占位符

      • [Text inside square brackets]

        可选项目

      • {Text inside braces}

        所需物品的集合;选一个

      • 竖条{a|b}

        互斥项目的分隔符;选一个

      • 省略号&lt;file&gt; …

        可以重复的项目

      【讨论】:

        【解决方案9】:

        这可能是一个题外话,但我曾经写过两个小工具,可以让命令行工具的创建和维护帮助页面更高效:

        • MAIN DOCLET 通过处理源代码中的 Javadoc cmets 为 Java 程序的 main 方法生成 HTML 文档
        • HTML2TXT tool 将 HTML 文档格式化为纯文本(这是我们想要的帮助文本)

        我将这两个工具集成到我的程序的 MAVEN 构建过程中,以便它们在每次构建时自动执行。

        例如:

        希望这对其他人有用!?

        【讨论】:

          猜你喜欢
          • 2014-02-15
          • 2021-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 1970-01-01
          • 2022-10-17
          相关资源
          最近更新 更多