命令行/ shell帮助文本是否有“标准”格式?


239

如果没有,是否存在事实上的标准?基本上,我在编写命令行帮助文本,如下所示:

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

我基本上是从阅读各种工具的帮助文本中得出的,但是有一些指导方针或其他内容吗?例如,我使用方括号还是括号?如何使用间距?如果参数是列表怎么办?谢谢!


8
我认为GNU有一些提示。我将看看大多数GNU实用程序在做什么。
Basile Starynkevitch 2012年

1
@DanielPryden我认为该问题的答案有些误导。它提供的链接说明了应该接受哪些开关,而不是其输出的--help外观。但是,这两个问题都是合并的理想选择。
pmr 2012年

@pmr:我同意-也许mod可以为我们合并问题。
丹尼尔·普里登

2
我将看看大多数GNU实用程序在做什么,反之亦然。
Yakov Galka '17

Answers:


160

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

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

此外,值得注意的,它的好形式,同时接受-h--help触发此消息,并认为你应该显示此消息,如果用户弄乱的命令行语法,例如省略了必要的参数。


3
如果我有两种形式的单个必需参数怎么办?例如,更标准的说法:usage: move (+|-)pixels即当+ -必填项时?(我知道我可以有2条用法行,但我喜欢将每个新参数加倍的用法。)您能想到标准工具中的示例吗?
Alois Mahdal

4
@AloisMahdal我平时看到{a|b|c|...}的帮助部分用于SysV初始化/新贵服务脚本,这需要一个单一的论点是一个abc,等。例如,service sddm没有在我的系统参数打印出来Usage: /etc/init.d/sddm {start|stop|status|restart|try-restart|force-reload}。因此,大多数人可能会理解usage: move {+|-}pixels},特别是如果举一个例子:example: move +5
Braden Best,

@JorgeBucaran他们不应该以状态0退出吗?我认为退出状态2是无效的Shell命令的标准。
inavda

91

看看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>...

46

我认为命令行用法没有标准语法,但是大多数使用以下约定:

Microsoft 命令行语法,IBM具有类似的命令行语法


  • Text without brackets or braces

    您必须输入的内容如下所示

  • <Text inside angle brackets>

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

  • [Text inside square brackets]

    可选项目

  • {Text inside braces}

    一套必需的物品;选一个

  • 竖条 {a|b}

    互斥项的分隔符;选一个

  • 省略 <file> …

    可重复的项目


16

我们正在运行Linux,这是一个大多数与POSIX兼容的操作系统。它应该是POSIX标准:实用程序参数语法

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

2
通常,在GNU / Linux中的用法并不完全遵循该标准。运行例如man aptitude输出以下内容(例如)aptitude [<options>...] {add-user-tag | remove-user-tag} <tag> <packages>...。它包含{和}以绑定替代的强制性命令。我认为(和)可以像在docopt中使用的一样使用。
jarno '16

如果提供的链接断开,此答案的帮助会大大减少。也许您可以在答案本身中总结链接文档的重要部分?
domsson

11

Microsoft有自己的命令行标准规范

本文档主要针对命令行实用程序的开发人员。总体而言,我们的目标是提供一致,可组合的命令行用户体验。实现使用户能够学习一组核心概念(语法,命名,行为等),然后能够将该知识转化为使用大量命令的工具。这些命令应该能够以标准化格式输出标准化的数据流,以便在不解析输出文本流的负担的情况下轻松进行编写。本文档的编写独立于Shell,实用程序集或命令创建技术的任何特定实现;但是,附录J-使用Windows Powershell实施Microsoft命令行标准显示了如何使用Windows PowerShell免费提供许多这些准则的实施。


9
微软对大多数实用程序都提供了可怕的命令行帮助,所有的一切都太糟糕了,以至于他们使Powershell将“常规”命令行隐藏在地毯下。
卡米洛·马丁

25
我认为答案不应仅因为它参考了微软的标准就被否决了。“一切都很糟糕”是一种主观意见。以同样的方式,可以说UNIX的命令行很丑陋,但是让我们远离这些观点,成为专家。
Dima

2
同意,这不是为什么这个答案应该被否决的原因。如果被否决,那应该是因为a)被引用的文档部分没有回答当前的问题,并且b)链接到的文档似乎不相关。该问题询问是否存在“帮助文本”的标准,其中特别强调用于传达命令用法提要的语法。该文件没有毫无顾忌这样的语法,而是如何建立在总体上是好的命令行应用在PowerShell中的生态系统(如必须支持-?-Help-Version,等)。IMO Steely Wing的答案接近目标。
Mark G.

9

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


0

是的,您的方向正确。

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

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

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

我希望这有帮助。


4
不不不。该命令应该有一个手册页,其中包括完整的详细使用参考,并且-h|--help应该只是摘要参考。您可能还会在HTML或信息页面中包含更全面的文档(教程等)。但是手册页应该在那里!
ninjalj 2012年

我同意@ninjalj的观点,但是正如我所说的,“一种新趋势”,也就是说我使用的两个系统UWin和MinGW都已包含嵌入式文档。我认为嵌入式文档具有它的用处,尤其是对于小型用户级脚本,例如该用户的建议。他是否应该学习nroff和.info?但是,请诚实地对待我们,谢谢您的评论,并祝大家好运。
剥壳机2012年

就个人而言,当我someCommand --help在shell上键入内容时,我只需要提醒一下参数输入的确切顺序,而不是一大堆填满屏幕的文本,需要我将其通过管道输入less才能看到所有内容。手册页应该是放置详细说明的地方,而不是帮助文本。
AJMansfield

根据docopt制造商的说法,他提到POSIX对此有规范。
v.oddou

0

我将以tar等官方项目为例。我认为帮助味精。需要尽可能简单和描述性。使用示例也很好。真正不需要“标准帮助”。


关于tar...如果某人要制造像tar这样的万能工具,请使简短的开关令人难忘,并在中包括“示例用法”部分--help。我有90%的时间查看tar的说明是为了提取一个简单的tar.gz
卡米洛·马丁

' 真正不需要“标准帮助”。'我们使用的大多数东西是否有“真正的需求”?还是只是为了让我们的生活更轻松?拥有一种商定的表示选项的方式不仅对读者有用,而且对构建例如可以控制任意命令行实用程序并希望提供用于设置其选项的控件的GUI的人也很有用。我可能还没有考虑更好的用途。
underscore_d
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.