命令行/Shell帮助文本有一个“标准”格式吗?

368

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

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
1
@DanielPryden 我认为那个问题的答案有点误导人。它提供了解释应该接受哪些开关而不是--help输出应该如何看的链接。但两个问题都是合并的好候选。 - pmr
@pmr:我同意——也许管理员可以为我们合并这些问题。 - Daniel Pryden
2
我会看看大多数GNU工具正在做什么,然后采取相反的方式。 - Yakov Galka
11个回答

239

通常,您的帮助文档应包括:

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

另外需要注意的是,为了触发此消息,良好的做法是接受-h--help两种方式,并且如果用户在命令行语法上出现错误(例如省略必需的参数),应显示此消息。


5
如果我有一个必填参数有两个形式怎么办?比如更标准的说法:usage: move (+|-)pixels,也就是要求 +- 其中之一是 必需 的?(我知道我可以有两个使用行,但我喜欢每个新参数时将它们加倍。)你能想到一个标准工具的例子吗? - Alois Mahdal
6
在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 - Braden Best
@JorgeBucaran 他们不应该以状态0退出,是吗?我认为以状态2退出是无效的shell命令的标准。 - inavda
这是一个不错的摘要:http://docopt.org/ - schoetbi

145

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

106

我认为不存在命令行用法的标准语法,但大多数使用这种约定:

微软命令行语法,IBM 有类似的命令行语法


  • 对于必须键入的项目,请使用不带括号或大括号的文本

    例如:ls

  • <值的占位符>

    例如:cat <file><file>应替换为文件的路径

  • [可选]

    例如:ls [-l]可以是lsls -l

  • {a|b}表示互斥项

    例如:ip {link|addr}可以是ip linkip addr

  • <file> ...表示可以重复的项目

    例如:cat <file> ...可以是cat a.txt b.txt c.txt


似乎有一篇由微软发布的文章,链接为https://devblogs.microsoft.com/powershell/microsoft-command-line-standard/,其中对“微软方式”有更具体的说明。此外,提到的IBM链接似乎已经失效了。可能是不再发布或者只是移动了位置。 - Chezzwizz

28
我们正在运行Linux,这是一个大多数符合POSIX标准的操作系统。 POSIX标准应该是:实用程序参数语法
  • 选项 是由连字符后跟单个字母或数字组成的,例如: -o
  • 选项可能需要一个参数(必须紧随在选项之后);例如:-o argument-oargument
  • 不需要参数的选项可以在连字符后分组,因此,例如:-lst 等同于 -t -l -s
  • 选项可以以任何顺序出现;因此,-lst 等同于 -tls
  • 选项可以出现多次。
  • 选项位于其他非选项参数之前:-lst nonoption。
  • -- 参数终止选项。
  • - 选项通常用于表示标准输入流之一。

4
在GNU/Linux中常见的情况是使用不完全遵循标准。例如运行“man aptitude”命令,会输出以下内容(以及其他内容):“aptitude [<options>...] {add-user-tag | remove-user-tag} <tag> <packages>...”,其中包含{和}绑定可选强制命令。我认为可以像docopt中那样使用(和)来实现相同的功能。 - jarno
如果提供的链接失效,这个答案将会不太有用。也许你可以在答案中总结链接文档的重要部分? - domsson
虽然不太可能,但这个页面有一天也可能会崩溃。只是说一下而已。因此,复制内容并不是解决死链接问题的方法。我们应该努力使互联网更加可靠。 - SasQ

11

微软有自己的命令行标准规范:

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


11
微软的大多数工具的命令行帮助都很糟糕,一切都很糟糕,以至于他们开发了PowerShell来把“传统”的命令行藏起来。 - Camilo Martin
40
我认为不应该只因为答案引用了微软的标准就将其降低评分。“一切都很糟糕”是主观意见。同样可以说UNIX的命令行也是糟糕丑陋的,但是让我们远离此类观点,保持专业态度。 - Dima
3
同意,这不是这个答案应该被 downvote 的原因。如果要 downvote,应该是因为 a) 引用的文档部分没有回答当前问题,b) 链接的文档似乎不相关。问题问的是是否有关于“帮助文本”的标准,重点放在用于传达命令使用概要的语法上。该文档并没有提供这样的语法,而是介绍了如何在 PowerShell 生态系统中构建良好的命令行应用程序(例如,必须支持“-? ”,“-Help”,“-Version”等)。我认为 Steely Wing 的答案更接近实际情况。 - Mark G.
1
但是,正如steely-wing已经提到的那样,微软也有这个更好、更简单的文档:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/command-line-syntax-key 此外,MotherDawg添加了一个指向POSIX的链接,它与上面的链接相同:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_01 而lily-finley则链接了不错的http://docopt.org/ 因此,我不会使用这个复杂的微软文档。 - xCovelus

11

GNU编码规范是这方面的一个好参考。 这个章节 讨论了--help的输出。 在这种情况下,它不是非常具体。 打印显示短选项和长选项以及简明描述的表格可能是正确的选择。 尝试为可读性正确设置所有参数之间的间距。 可能需要提供一个man页(可能还有一个info手册),以提供更详细的说明。


3

目前还没有标准,但http://docopt.org/已经为命令行工具的帮助文本制定了他们自己的规范。


1

虽然有点偏题,但我曾经编写了两个小工具,可以更有效地创建和维护命令行工具的帮助页面:

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

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

例如:

希望对其他人有所帮助!?


1

是的,你走在正确的道路上。

是的,方括号通常用于表示可选项。

通常情况下,就像你所描述的那样,在顶部有一个命令行摘要,然后是详细信息,最好为每个选项提供示例。(你的示例显示了每个选项描述之间的行,但我假设这是编辑问题,并且你的真实程序输出缩进的选项列表,没有空行。无论如何,这都是要遵循的标准。)

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

希望这可以帮到你。


7
不不不,该命令应该有一个手册页面,其中包括完整的使用详细参考,而“-h | --help”只应该是一个简要的参考。你也可以在HTML或信息页面中包含更全面的文档(教程等),但手册页面一定要有! - ninjalj
我同意你的看法,@ninjalj,但正如我所说,“一种新趋势”,我的意思是我使用的两个系统,UWin和MinGW都采用了嵌入式文档。我认为嵌入式文档有其适用场合,特别是对于像这位用户提出的小型用户级脚本。他需要学习nroff和.info吗?但是保持诚实很好,感谢您的评论,祝大家好运。 - shellter
1
就我个人而言,当我在 shell 中键入 someCommand --help 时,我只需要一个小提示来提醒我参数的精确顺序,而不是一大堆填满屏幕的文本,需要将其管道传输到 less 中才能查看全部内容。手册应该是放置长详细描述的地方,而不是帮助文本。 - AJMansfield
根据 Docopt 的开发者在他的会议上提到,POSIX 对此有一个标准。 - v.oddou

1
我使用CSS正式符号来实现这个。

Component values may be arranged into property values as follows:

  • Several juxtaposed words mean that all of them must occur, in the given order.
  • A bar (|) separates two or more alternatives: exactly one of them must occur.
  • A double bar (||) separates two or more options: one or more of them must occur, in any order.
  • A double ampersand (&&) separates two or more components, all of which must occur, in any order.
  • Brackets ([ ]) are for grouping.

Juxtaposition is stronger than the double ampersand, the double ampersand is stronger than the double bar, and the double bar is stronger than the bar. Thus, the following lines are equivalent:

    a b   |   c ||   d &&   e f
  [ a b ] | [ c || [ d && [ e f ]]]

Every type, keyword, or bracketed group may be followed by one of the following modifiers:

  • An asterisk (*) indicates that the preceding type, word, or group occurs zero or more times.
  • A plus (+) indicates that the preceding type, word, or group occurs one or more times.
  • A question mark (?) indicates that the preceding type, word, or group is optional.
  • A pair of numbers in curly braces ({A,B}) indicates that the preceding type, word, or group occurs at least A and at most B times.
如果您需要例子,请参见 MDN 上的 正式定义 部分;这是一个关于 font 的例子:https://developer.mozilla.org/en-US/docs/Web/CSS/font#formal_syntax
下面是我自己的 Pandoc 速查表中的一个简单示例:
$ pandoc <input_file>.md --from [markdown|commonmark_x][-smart]? --to html --standalone --table-of-contents? --number-sections? [--css <style_sheet>.css]? --output <output_file>.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接