单破折号“-”表示单字符选项,但双破折号“--”表示单词?

单破折号“-”表示单字符选项,但双破折号“--”表示单词?

使用单破折号表示字母和双破折号表示单词的惯例从何而来?为什么继续使用?

例如,如果我输入ls --help,您会看到:

  -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 ~
...

我尝试用谷歌搜索- and -- convention,即使使用引号也收效甚微。

答案1

Unix 编程的艺术埃里克·史蒂文·雷蒙德 (Eric Steven Raymond) 描述了这种做法的演变过程:

在最初的 Unix 传统中,命令行选项是单个字母,前面有一个连字符……最初的 Unix 风格是在缓慢的 ASR-33 电传打字机上发展起来的,这使得简洁成为一种美德;因此是单字母选项。按住shift键需要付出实际的努力;因此,优先使用小写字母,并使用“-”(而不是可能更合乎逻辑的“+”)来启用选项。

GNU 风格使用选项关键字(而不是关键字字母),前面有两个连字符。几年后,当一些相当复杂的 GNU 实用程序开始用完单字母选项键时,它就得到了发展(这只是缓解症状,而不是治疗根本疾病)。它仍然很受欢迎,因为 GNU 选项比旧风格的字母汤更容易阅读。1

[1]http://www.catb.org/esr/writings/taoup/html/ch10s05.html

答案2

继续使用单字母选项的一个原因是它们可以串在一起:ls -ltr很多比 更容易输入ls --sort=time --reverse --format=long。很多时候两者都很好用。至于搜索这个主题,请尝试“unix命令行选项约定”。

答案3

引用雷蒙德的话@jasonwryan 有一些有用的信息,但从故事的中间开始:

  • 请记住,Unix 最初是 Multics 的缩小版,并且在整个历史中,Unix 中的功能通常是对其他系统上看到和使用的功能的模仿或改编。
  • '-'Multics 中使用了选项字符。Bitsavers 有一个手册用户命令
  • 其他系统使用不同的字符,一些字符较多,声称击键效率更高(例如'/'用于 TOPS 和 VMS),有些则较少(例如'('在 VM/SP CMS 中使用)。
  • 多路系统选项是多字符,例如,由下划线分隔的关键字。
  • 较长的 Multics 选项通常有较短的缩写形式,例如-printvs -pr(第 3-8 页)。
  • Unix 选项是单字符的,几年后,getopt被介绍了。因为它不是原始 Unix 的一部分,所以有些实用程序没有使用getopt并保持原样。但getopt有助于使程序保持一致。

另一方面,Unix 选项使用的getopt是单字符。其他系统,特别是所有较大的系统,都使用关键字。一些(不是全部)允许这些关键字缩写的,即只要选项明确,就不会提供所有字符。该模糊性测试存在陷阱。例如:

  • 1985 年初,我正在开发一个程序,该程序必须移植到普里操作系统。 Prime 的开发人员与其他几家公司竞争,提供一种(试图)模仿其他公司的命令语言,提供每个公司最常用的命令。当然,他们支持缩写(VMS 也是如此)。读完在线帮助后,我打字sta,想着得到status。这是 的缩写start,并且没有给出任何内容开始,命令解释器将我注销。
  • X 工具包(由xterm) 允许缩写选项。为了在 xterm 中有效地使用它,它必须预处理命令参数以优先选择-v(版本)而不是-vb(视觉铃声)。当存在歧义时,X Toolkit 没有直接的方法来指定首选选项。

由于这种潜在的歧义,一些开发人员宁愿不允许缩写。 山猫例如,使用多字符选项而不允许缩写。

并非所有程序都使用getopt:tar并且ps没有。也没有rcs(或者sccs),您可以通过注意破折号是可选的以及选项值是可选的来看到。

考虑到所有这些,GNU 开发人员通过扩展getopt来提供每个短选项的长版本,从而适应了其他系统中使用的关键字选项。例如,textutils 1.0 变更日志说

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

fileutils 中的更改较早:

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

有人可能会找到更早的日期,但文件头似乎显示了最早的日期:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

它(例如)与 X Toolkit (1987) 并行。大多数您熟悉的 Unix 实用程序(例如ls,ps)使用了现有的单字符选项,需要定期访问手册。getopt_longGNU开发者在介绍时并没有这样做第一的添加新选项;他们开始通过列出现有选项并提供匹配的长选项。

因为他们是添加对于现有的曲目,(再次)存在与现有选项冲突的问题。为了避免这种情况,他们更改了语法,在长选项前使用两个破折号。

这些程序继续以这种方式使用的getopt_long原因如下:

  • 脚本取决于选项;开发人员并不急于破坏脚本
  • 有一个写的编码标准(这可能有效)
  • 没有人提出一套明显不兼容的竞争工具(BSD 和 GNU 开发人员互相复制选项名称)

答案4

使用这两种方法可能有几个原因。当然,其一是传统。程序员和用户都是人类,人类期望事物以某种方式运行。如果没有理由改变(实际上,对于命令行来说,没有太多理由改变),那就不要改变。

话虽这么说,我知道有些工具可以使用单个连字符作为长选项,甚至完全删除连字符。这些工具一开始可能会很困难,并且在统一的系统中往往会显得很突出。

当我学习两者之间的区别时(在它成为第二天性之前),我总是记得“短”连字符与“短”选项匹配,而“长”(或双)连字符与“长”选项匹配选项。我不知道双连字符样式的开发中是否使用了这种推理,但这是有可能的。

相关内容