为什么我们在 中使用双连字符tar --anchored
而在 中使用单连字符tar -b
?
我的意思是说为什么有些命令行选项有单连字符 (-),而另一些则有双连字符 (--)?
还有一个git
例子:
git commit --amend
git commit -a
答案1
传统上,长选项(超过一个字母)用两个破折号书写,短选项(一个字母)用一个破折号书写。然而,并非所有程序都尊重这一点。
我能找到的最古老的参考资料之一是:http://www.gnu.org/fun/jokes/long-options.html。
答案2
一破折号代表一(或许多) 缩写参数:
command -abc
用于单个未缩写参数的双精度数:
command --alice --barry --catherine
值得注意的是,这只是一个约定。任何命令都可以采用任何样式的任何参数(前提是它们从 shell 中转义),无论破折号如何。如果我们这里的示例command
被编程为接受它们,则以下内容可以是上述示例的有效同义词:
command abc
command alice barry catherine
这些可能是可怕的例子,但我试图理解的是,这是一种将参数作为非位置参数处理的方法的约定。有些东西不想要。有些东西只使用单个破折号。有些东西使用破折号以外的字符(我见过交叉编译的 Windows 应用程序仍在使用/
)...这确实没有那么大的区别。
答案3
正如其他人已经说过的,这是 GNU 项目发起的一项约定,使用单个减号表示缩写,这意味着一个字母长的选项,使用双减号表示长选项,这意味着比一个字母长的选项。这个约定已经很完善,并被 GNU 之外的许多项目所使用,但是当它被引入时,它让一些习惯于只使用短选项的人感到困惑。然而,还有更多内容:
- 一些程序,例如git允许在长选项的第一个字母之前使用单个减号。在这种情况下,此选项将扩展为以此字母开头的长选项,就像提供了两个减号和完整的选项名称一样。例如:
$ git pull -r
相当于:
$ git pull --rebase
- 一些程序,例如 GNU日期与 git 类似,但仅展开部分长名称选项(如果它们前面有两个减号):
$ date --s
相当于:
$ date --set
- 一些程序,例如杂种狗或者git允许在选项之后和值之前省略空格:
$ mutt -f/var/mail/user
相当于:
$ mutt -f /var/mail/user
- 一些程序,例如 GUNR M允许对单个选项进行分组。例如:
$ rm -rv dir
相当于:
$ rm -r -v dir
- 一些采用带有参数的选项的程序使用空双减选项来标记选项的结尾。例如,如果您想使用触碰命令创建一个以减号开头的文件,您必须这样做:
$ touch -- -file
这完全取决于特定软件如何解析其选项。
另请注意"-"
您所指的标志连字符被称为减对于大多数 Unix 用户来说,主要是因为有些程序采用以加号开头的选项(X例如)。看这里。
答案4
rmdir --ignore-fail-on-non-empty {directory} ...
双破折号 (--) 位于整个单词之前,否则只需使用开头带有一个破折号的单个字母 (-)。
查看其他手册,例如rmdir
手动的,它显示了您可以使用的选项表:
-p
--ignore-fail-on-non-empty
-f, --force
-r, -R, --recursive
-v, --verbose