shell 命令上的单破折号和双破折号标志有什么区别?

kyl*_*lex 92 shell

我是在 shell 中工作的新手,这些命令的使用似乎是随意的。有没有原因一个标志有一个破折号而另一个可能有双破折号?

psu*_*usi 138

单个连字符后可以跟多个单字符标志。双连字符作为单个多字符选项的前缀。

考虑这个例子:

tar -czf
Run Code Online (Sandbox Code Playgroud)

在这个例子中,-czf指定了三个单字符标志:cz,和f

现在考虑另一个例子:

tar --exclude
Run Code Online (Sandbox Code Playgroud)

在这种情况下,--exclude指定名为 的单个多字符选项exclude。双连字符的歧义消除命令行参数,以确保tar将其解释为exclude而非的组合exclud,和e

  • 有时甚至很长的命令也可以是单破折号。例如,'cdrecord' 使用所有单虚线命令(-eject -dao ...)。这一切都取决于程序,但其中大多数(!)使用 - 用于单个和 - 用于多字符(长)命令 (17认同)
  • 还要记住——单独使用通常意味着选项的结束。在这里查看更多信息:http://unix.stackexchange.com/questions/11376/what-does-double-dash-mean (12认同)
  • @mulaz,是的,cdrecord 做了很多愚蠢的事情。 (8认同)
  • @killjoy,因为无论是由于无知还是选择,这些程序的作者当然都没有遵循惯例。就像多年前在上面的评论中提到的 `cdrecord` 一样。 (4认同)
  • 那么为什么是 java -version 和 ant -version 呢? (2认同)

mul*_*laz 23

这一切都取决于程序。通常“-”用于“短”选项(一个字母,-h),“--”用于“长”(er)选项(--help)。

通常可以组合短选项(因此“-h -a”与“-ha”相同)

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

来源

  • 那么为什么是 java -version 和 ant -version 呢? (3认同)

小智 10

这真的是一个约定。但是,它可以帮助解析器更有效地了解传递给程序的选项。此外,还有一些简洁的实用程序可以帮助解析这些命令,例如帮助解析程序参数的getopt(3)非标准命令getopt_long(3)

这很好,因为我们可以组合多个简短的选项,正如其他答案所说,例如tar -xzf myfile.tar.gz.

如果有一个“丽莎”的说法ls,有可能会具有不同的意义键入ls -lisals --lisa。前者是lis,和a参数,而不是这个词。

实际上,您可以编写ls -l -i -s -a,其含义与 完全相同ls -lisa,但这取决于程序。

也有不遵守这个约定的程序。最值得注意的是我的视力,ddgcc


Pre*_*raj 6

单破折号的短选项与双破折号的长选项

短选项可以组合成一个参数;

for example: ls -lrt #instead of ls -l -r -t
Run Code Online (Sandbox Code Playgroud)

如果我们允许带有单破折号的长选项,则会导致歧义。为了解决这个问题,我们对长选项使用双破折号。