使用单破折号表示字母和双破折号表示单词的惯例从何而来?为什么继续使用?
例如,如果我输入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
答案2
继续使用单字母选项的一个原因是它们可以串在一起:ls -ltr
是很多比 更容易输入ls --sort=time --reverse --format=long
。很多时候两者都很好用。至于搜索这个主题,请尝试“unix命令行选项约定”。
答案3
这引用雷蒙德的话@jasonwryan 有一些有用的信息,但从故事的中间开始:
- 请记住,Unix 最初是 Multics 的缩小版,并且在整个历史中,Unix 中的功能通常是对其他系统上看到和使用的功能的模仿或改编。
'-'
Multics 中使用了选项字符。Bitsavers 有一个手册用户命令。- 其他系统使用不同的字符,一些字符较多,声称击键效率更高(例如
'/'
用于 TOPS 和 VMS),有些则较少(例如'('
在 VM/SP CMS 中使用)。 - 多路系统选项是多字符,例如,由下划线分隔的关键字。
- 较长的 Multics 选项通常有较短的缩写形式,例如
-print
vs-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_long
GNU开发者在介绍时并没有这样做第一的添加新选项;他们开始通过列出现有选项并提供匹配的长选项。
因为他们是添加对于现有的曲目,(再次)存在与现有选项冲突的问题。为了避免这种情况,他们更改了语法,在长选项前使用两个破折号。
这些程序继续以这种方式使用的getopt_long
原因如下:
- 脚本取决于选项;开发人员并不急于破坏脚本
- 有一个写的编码标准(这可能有效)
- 没有人提出一套明显不兼容的竞争工具(BSD 和 GNU 开发人员互相复制选项名称)
答案4
使用这两种方法可能有几个原因。当然,其一是传统。程序员和用户都是人类,人类期望事物以某种方式运行。如果没有理由改变(实际上,对于命令行来说,没有太多理由改变),那就不要改变。
话虽这么说,我知道有些工具可以使用单个连字符作为长选项,甚至完全删除连字符。这些工具一开始可能会很困难,并且在统一的系统中往往会显得很突出。
当我学习两者之间的区别时(在它成为第二天性之前),我总是记得“短”连字符与“短”选项匹配,而“长”(或双)连字符与“长”选项匹配选项。我不知道双连字符样式的开发中是否使用了这种推理,但这是有可能的。