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


65

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

例如,大多数程序如下所示: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

而某些程序如下所示: xmllint --valid toc.xml --noout

为什么有些要求两个破折号而不是一个破折号的原因是什么?每个人都坚持一个标准不是很有意义(即一个破折号就能做到)。


10
>每个人都坚持一个标准不是很有意义 –是的。所有程序员都遵守标准并保持一致性吗?不。许多程序员甚至无法保持程序内部一致性:)话虽如此,共识是只对一个字母的选项使用一个破折号,而对于所有实际单词,例如-ivs. --input或,使用两个破折号-n --dry-run
slhck 2011年

1
@slhck嘿,谢谢您的帮助=)照惯例,这是否意味着-dtd确实应该这样做--dtd?我实际上想知道的是,破折号(和双破折号)试图表示什么?
Pacerier,2011年

6
奖励积分:符合Gnu标准的程序--long-options也将接受任何唯一的缩写。因此,对于带有选项--file-inand 的程序--file-out,可以使用--file-o=fooor --file-i=foo,它可以节省一些输入--very-long-optional-parameters
BRPocock 2011年

GNU与他们使用两个破折号为“长”的选项,这是我碰巧喜欢,但很多老实用程序,如那些与X Window系统,以及ImageMagick的捆绑约定走过来(例如convertmogrify),有“长”选项仅使用一个破折号。例如:xterm -fn 6x10 -geometry 80x24+30+200。缩写支持,只要它们是不同的(例如-g-geom-geometry)。有关其他示例,请参见X(7)
TheDudeAbides

Answers:


18

只是做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'

4
我们如何ls --help在Windows上进行操作?
Pacerier,2011年

1
@Pacerier lsWindows 上没有。等效命令为dir /?。您正在使用违反常规Windows约定的跨平台软件,请参阅我的答案。
丹尼尔·贝克

@Pacerier它不是内置的,但可以下载到第3方,您可以通过Gnuwin32下载它(google gnuwin32)。gnuwin32中有很多软件包,每个软件包都有命令,请下载coreutils软件包,其中包含许多常用命令。
barlop 2011年

ls --help摘录中有很多选择,没有很多选择。请参阅--author--block-size
2013年

要回答@Pacerier原始评论中的问题:现代Windows系统获取ls命令的最常见方式是通过GIT。在PATH中具有GIT bin的GIT bash shell或CMD窗口将具有ls
yzorg

34

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

引用维基百科,重点是:

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

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


您经常会发现相同的参数既可以用作short选项,也可以用作long选项,例如ls

某些程序将单个连字符用于一个字符选项,将两个连字符用于多个字符选项,但并非全部(GNU find浮现在脑海)。某些程序带有可选的连字符或完全跳过它们(tarps想到BSD )。

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

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

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

值得一提的是,某些程序不能处理选项与其参数之间的空格,而其他程序则不能。

正如我在开始时所写的那样,没有通用的行为或标准。通常,您可以追踪到与用于参数解析的库相同的行为,但是您可能不想阅读源代码来找出答案。

您真的不能从另一个程序推论一个程序的参数语法。


如果您还考虑使用Windows,则情况会变得更糟:尽管Windows命令行传统上使用选项/f(至少在大多数情况下使用单个字符)作为选项,并使用:选项和它们的值之间的分隔符(例如请参见此处)。跨平台实用程序很广泛(例如您提到的那些实用程序),并且为参数带来了更常见的连字符语法,并带有上面提到的所有不一致之处。


2
应该注意的是,GNU标准库提供了映射一减一字母,两减多字母选项的功能,因此所有新的GNU程序和大多数新的自由软件通常都使用此表示法(例如- f,-f foo,--file,--file foo,--file = foo,--fil = foo,--fi = foo); 返祖如tarpsfind并且这样的有他们的命令行由POSIX设置之前这一标准已经完全凝胶化语法。关于GNU / Linux系统,这是一个相当安全的赌注,至少--help会(几乎)总是被支持,以及man <command>info <command>
BRPocock

GNU标准是否说没有长格式就不应该有短格式,没有短格式就不应该有长格式?
barlop

+1是最完整的答案,包括提及GNU find的长选项不遵循“ GNU约定”(可能是由于POSIX合规性,如@BRPocock所指出)。如果可以的话,我会再次+1,因为它提到了DOS / Windows命令行“开关”,因为OP的问题以某种方式被标记为“窗口”,为了完整起见,应该提到该约定。
TheDudeAbides

7

这是来自* nix的约定。当它们被写入双连字符前面的选项全部,而当它们被写入一个连字符先选择以短形式。例如ls --all --l,可以缩短为ls -al。可以看出,尽管通常使用更多的选项,但并非所有选项都有其单字母等效项。

选项是否接受参数并没有真正的区别-无论输入选项如何,都可以接受,也可以不接受。

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


嘿,谢谢您的帮助,顺便说一句,您将unix输入* nix是有原因的吗?
Pacerier,2011年

2
@Pacerier-Unix是商品名。通过输入* nix,我实际上指的是所有unix和类似系统,出于所有实际目的,它们都是相同的。但大多数情况下,这是一种习惯力量……
Rook

2
@Pacerier * nix可以指Linux或Unix。我不确定这是因为我曾经研究过一段时间,但是从技术上讲,如果我记得,BSD来自Unix系列。从技术上讲Linux不是.. FreeBSD也不是。但是说* nix会包括unix / bsd以及类似的东西,例如linux和freebsd。
barlop 2011年

2
+1表示速记命令组合。这就是为什么有两种风格的真正原因。
Ryan_S 2015年

3

这些是常规的UNIX语法,

一个简单的选项(例如:-v)时,程序参数使用一个连字符(“-”),后跟一个字母;当该选项接受参数(例如:-- file toc.xml)时,则使用两个连字符(“-”)。 或--file = toc.xml

对程序功能没有影响。


3
此外,在许多情况下,如果在单个破折号后加上单个字母选项,则可以将字母分组在一起。例如,“ ls -al”与“ ls -a -l”相同。双破折号选项不能以这种方式组合。单字母选项是较旧的标准,但是如今,许多命令将同时使用这两种类型。例如,“ ls --all”与“ ls -a”相同。
兰迪·奥里森

3
实际上,是另一种更正。单破折号单字母选项可以带参数,但通常不与等号链接。例如,“ tail -n 50”显示文件的最后50行,等效于“ tail --lines = 50”。
兰迪·奥里森

按照这个约定,这是否意味着--noout(在上面的问题中)实际上应该被编写为-noout没有参数
Pacerier,2011年

1
这个关于参数的回答完全是错误的。第一句话很明显。最后一句话很明显。而应该回答问题的中间段落,是完全错误的。
barlop 2011年

@RandyOrrison,当我从未见过等号的单个字母时..为了详细说明您的观点,他们经常采用参数。wget -w 10头-n 3切-b 2然后看Ping-吗?!! 载荷采用参数。这个答案很糟糕
barlop

3

单破折号由getopt实现,是posix标准函数,双破折号在getopt_long中是gnu标准。

传统上,单破折号会提供单个字符选项,如下所示:

-A或-V等,但不限于此。例如,-gall的-Wall打开gcc编译器命令的所有编译器警告。

双破折号参数往往更冗长,通常采用--max-count = NUM​​之类的提供参数。但是,--version不等于。

一般而言,关于如何指定程序参数没有规则或已定义的标准,只是一堆传统。但是,如果使用了getopt和getopt_long命令行解析函数,则参数通常应遵循该标准,因为库函数会强制执行某种特定方式。

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.