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

Pac*_*ier 76 windows linux unix command-line

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

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

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

有些需要两个破折号而不是一个破折号的原因是什么?每个人都坚持一个标准是否有意义(即一个破折号就可以)。

Dan*_*eck 39

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

引用Wikipedia,强调我的:

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

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


您经常会发现相同的参数可用作 short 和 long 选项,例如在ls 中

一些程序对单字符选项使用单个连字符,对多字符选项使用两个连字符,但不是全部(find想到GNU )。一些程序有可选的连字符或完全跳过它们(tar或者ps想到BSD )。

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

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

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

与此相关的是,一些程序可以处理option 和它的 argument 之间没有空格,而其他程序则不能。

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

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


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

  • 应该注意的是,GNU 标准库提供了映射一减一字母、二减多字母选项的功能,因此*所有*新的 GNU 程序和*大多数*新的免费软件通常使用这个符号(例如 -f、-f foo、--file、--file foo、--file=foo、--fil=foo、--fi=foo);诸如`tar`、`ps`、`find` 之类的回溯在这个标准完全凝固之前就已经由POSIX 设置了它们的命令行语法。在 Gnu/Linux 系统上,*合理* 安全地打赌至少会(几乎)始终支持 `--help`,以及 `man <command>` 或 `info <command>` (2认同)

bar*_*lop 25

只需执行ls --help 并查看选项,然后就会更清楚。

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

而且,关于参数,只是在长格式中,当它们采用参数时,它看起来总是带有等号。但很明显,短的也可以接受同样多的参数;只是他们不使用等号。

这是从ls --help(man 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'
Run Code Online (Sandbox Code Playgroud)

  • 我们如何在 Windows 上执行 `ls --help`? (5认同)
  • @Pacerier Windows 上没有 `ls`。等效的命令是`dir /?`。您正在使用违反通常的 Windows 约定的跨平台软件,请参阅我的回答。 (2认同)

Roo*_*ook 10

这是来自 *nix 的约定。双连字符在选项之前是完整的,而单连字符在选项之前是短格式。例如ls --all --l,可以缩短为ls -al. 正如所见,并非所有选项都有它们的单字母等价物,尽管更常用的选项通常如此。

选项是否接受一个参数并没有真正的区别 - 它可以接受或不接受它们,无论您输入选项的方式如何。

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

  • @Pacerier - Unix 是一个商品名称。通过键入 *nix 我实际上指的是所有 unix 和类似系统,它们对于所有实际目的都是相同的。但大多数情况下,这是一种习惯的力量...... (2认同)
  • @Pacerier *nix 可以指 Linux 或 Unix。我不完全确定这个 'cos 一段时间前我研究过它,但从技术上讲,如果我记得的话,BSD 来自 Unix 家族。从技术上讲,Linux 不是…… FreeBSD 也不是。但是说*nix 将包括unix/bsd,以及任何类似的东西,例如linux 和freebsd。 (2认同)
  • +1 用于提及速记命令组合。这就是_为什么_有两种风格的真正原因。 (2认同)