命令提示符参数的单破折号和双破折号有什么区别?

命令提示符参数的单破折号和双破折号有什么区别?

我想知道为什么有些程序要求它们的命令提示符参数有两个破折号在前面,而有些(大多数)只需要一个短跑在前?

例如大多数程序看起来像这样:relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

而有些程序看起来像这样:xmllint --valid toc.xml --noout

为什么有些要求使用两个破折号而不是一个?每个人都坚持使用一个破折号不是更有意义吗?标准(即,一个破折号就可以了)。

答案1

只要这样做ls --help 并查看选项,就会更清晰。

它与参数完全无关。许多选项都有短格式和长格式,许多选项只有一个长格式而没有另一个。

另外,关于参数,长格式中当它们接受参数时,看起来总是带有等号。但显然短格式也可以接受参数;只是它们不使用等号。

以下是摘录自ls --helpman ls给出了等效信息)。请注意,有些表只有长形式而没有短形式(--author, --block-size),有些表只有短形式而没有长形式(-c, -f, -g),有些表既有长形式又有短形式(-A/ --almost-all, -b/ --escape)。

 -a, --all                  do not ignore entries starting with .
 -A, --almost-all           do not list implied . and ..
     --author               with -l, print the author of each file
 -b, --escape               print octal escapes for nongraphic characters
     --block-size=SIZE      use SIZE-byte blocks
 -B, --ignore-backups       do not list implied entries ending with ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'

答案2

没有普遍适用的标准。例如,在 GNU 程序中存在一定的一致性,但您需要检查每个程序的文档。

引用维基百科,重点是我的:

在类 Unix 系统中,ASCII 连字符减号通常用于指定选项。该字符后面通常跟一个或多个字母。如果参数本身是一个连字符(减号),而没有任何字母,则通常指定程序应该处理来自标准输入的数据或将数据发送到标准输出。一些程序使用两个连字符(--)来指定“长选项”,其中使用更具描述性的选项名称.这是GNU软件的常见特征。

通常,连字符表示预定义参数。我认为它用于将它们与文件名或其他可能用作参数的标签区分开来。但情况并非总是如此(见下文)。


你经常会发现相同的参数既有短选项也有长选项,例如ls

有些程序使用单个连字符表示单字符选项,使用两个连字符表示多字符选项,但并非所有程序都如此(例如 GNU find)。有些程序有可选的连字符,或者完全跳过它们(tar例如 BSD ps)。

有时长选项(--foo)需要参数,而短选项(-f)则不需要(或者至少暗示特定的默认参数)。

短选项(例如cut -d ' ')可以有参数,而长选项(例如ls --all)不一定有参数。

要设置程序的特定行为,有时您需要使用短选项,对于其他行为,您需要使用长选项,而对于某些行为,您可以选择。

与此相关的是,有些程序可以处理选项与其参数之间没有空格,而有些则不能。

正如我在开头所写,根本没有共同的行为或标准。通常,您可以将类似的行为追溯到用于参数解析的同一库,但您可能不想阅读源代码来找出这一点。

你确实无法从另一个程序的参数语法推断出一个程序的参数语法。


如果你也考虑 Windows,情况会变得更糟:虽然 Windows 命令行调用传统上使用/f(至少大多数时候是单个字符)作为选项,并使用:作为选项和它们的值之间的分隔符(参见例如这里); 跨平台实用程序非常普遍(比如您提到的那些),并且带来了更常见的参数连字符语法,以及上面提到的所有不一致之处。

答案3

这是来自 *nix 的惯例。选项以双连字符开头时,在全, ,而选项前面写有单个连字符简短形式。例如ls --all --l,可以缩写为ls -al。如你所见,并非所有选项都有其单字母对应项,尽管更常用的选项通常都有。

该选项是否接受参数实际上并没有区别——无论您以何种方式输入该选项,它都可以接受参数,也可以不接受参数。

当它们仅供一次性使用时,这并不重要,但在 .alias 文件中编写命令时,习惯使用完整形式。纯粹是为了让下一个人更容易阅读。

答案4

这些是传统的 UNIX 语法,

当程序参数是简单选项时,它采用一个连字符(“-”)后跟一个字母(例如:-v) 和两个连字符 (“--”)(当选项带有参数时)(例如: --文件 toc.xml或者--文件=toc.xml

对程序的功能没有影响。

相关内容