2017-08-26 50 views
0

在Linux命令行中,可以使用两种方法之一将选项传递给命令。我们可以使用简短选项格式,该格式使用单个破折号后跟单个字母,例如:-o或使用两个连续破折号后跟一个单词的长选项格式,例如:--option。但最近我遇到了一些命令,这些命令在我的思维中使用了这两种格式的“混合”格式,后面使用单个短划线,例如:-option。现在我不是在讨论一个可以将多个短期选项粘在一起的命令,如ls -lisa。我正在谈论的是选项,单个短划线之后的单词只是一个选项,而不是多个短期选项串在一起。bash中命令的3选项语法之间的区别

我似乎不明白为什么有第三种选择。因为我对Linux命令行的了解只有短格式或长格式。第三种格式来自哪里?

这实际上令人困惑,因为有时您不能确定第三种格式是真正的破折号,后跟一个选项还是短划线,后跟多个短期选项。

+2

你忘了第四个选项,根本没有破折号。但是这些都与bash无关。 –

+1

所有这些选项都只是约定。 Bash和其他所有shell在执行程序时并不关心破折号 - 程序可以。你可以编写一个程序,它只接受作为选项传递的选项 - :) :) – Socowi

+0

StackOverflow是关于帮助人们修复他们现有的编程代码。关于编程理念,教程,研究,工具,建议,库和代码的讨论请求是无关紧要的。 ***请***阅读http://stackoverflow.com/help/how-to-ask,http://stackoverflow.com/help/dont-ask,http://stackoverflow.com/help/mcve和参加[旅游](http://stackoverflow.com/tour),然后在此发布更多Q​​.祝你好运。 – shellter

回答

3

这不是一个bash问题。所有程序都有处理选项/标志的方法。有许多不同的风格:

  • 的烧灼字母风格,配有一个连字符,例如: ls -l

  • 助记符风格的双破折号,这似乎为GNU-东西的偏爱,对例如,ls --size

  • variable=value式的,例如dd if=file of=otherfile

  • 选项没有破折号,如tar cvzf arghive.tgz

  • 你甚至可以使用的一个+代替-(如date +%m)。

等等。

理解bash只是将这些选项传递给程序/命令很重要。因此,在您将通常看到的程序中:

int main(int argc, char *argv[]){ 

(c代码示例)。在这种情况下,argv[0]将指向程序名称(以简化一些事情)并且argv[1]将指向第一个参数。根据计划,这可能会有所不同。

通过内置命令的快速扫描发现内置插件似乎总是使用负单字母(-a)来指定选项。

+0

除了'测试',但这是为了与sh兼容。 –

2

我认为你很困惑哪个组件会执行解析的哪一部分。

您键入bash的命令行会被解析两次。首先它被bash解析。在这个阶段,空格被用来分隔不同的参数。行情和逃跑正在考虑之中。通配符被扩展,并且$变量被替换。

在这个阶段结束时,我们剩下一个命令行,它有一个字符串列表,其中第一个描述了要执行的命令。在这一点上,bash调用execve,并将它传递给字符串列表。

解析的下一个阶段是可选的,取决于每个程序的执行情况。大多数程序调用getopt_long,这是一个解析选项的库函数。你提到的一两破折号惯例是由它应用的(以及它的老同胞,getopt)。

然而,每个程序都要解析自己的参数。许多程序使用getopt_long,这就是为什么你觉得这是一个标准。但有些人却没有。那些不按照自己的方式。

这就是事情的方式。

对于您的程序,您应该尝试使用getopt_long或某种兼容解决方案,因为这会对用户造成最少的混淆。

相关问题