在雷蒙德-报价由@jasonwryan有一些有用的信息,但在故事的中间开始:
- 请记住,Unix最初是Multics的缩小范围版本,并且在其整个历史中,Unix中的功能通常是对在其他系统上看到和使用的功能的模仿或改编。
- 该
'-'
选项字符是在Multics的使用。Bitsavers有其用户命令手册。
- 其他系统使用不同的字符,其中一些声称具有更高的击键效率(例如
'/'
用于TOPS和VMS),而另外一些则较少(例如'('
在VM / SP CMS中使用)。
- Multics 选项是多字符的,例如,关键字之间用下划线分隔。
- 较长的Multics选项通常具有较短的缩写形式,例如
-print
vs -pr
(第3-8页)。
- Unix选项是单字符的,并且在几年
getopt
后被引入。因为它不是原始Unix的一部分,所以有一些实用程序没有使用getopt
,而是按原样保留。但是getopt
帮助使程序保持一致。
另一方面,使用Unix的选项getopt
是单字符。其他系统,尤其是所有较大的系统,都使用了关键字。有些(不是全部)允许将这些关键字缩写,即,只要选项没有歧义,就不会提供所有字符。该测试存在歧义性。例如:
- 1985年初,我正在开发一个必须移植到PrimOS的程序。Prime的开发人员通过提供(尝试)模仿其他每个公司的命令语言,并从每个公司提供最常用的命令来与其他几家公司竞争。当然,他们支持缩写(VMS也是如此)。阅读在线帮助后,我打了
sta
一下电话,想得到status
。那是的缩写start
,命令解释器没有让我开始,而是注销了我。
- X Toolkit(由xterm使用)允许使用缩写的选项。为了在xterm中有效地使用它,它必须对命令参数进行预处理,以便
-v
(对于版本)优先于-vb
(可视铃声)。如果存在歧义,X Toolkit无法直接指定首选选项。
由于存在这种含糊不清的可能性,因此一些开发人员倾向于不允许使用缩写。 例如,Lynx使用多字符选项,但不允许使用缩写。
并非所有程序都使用过getopt
:tar
并且ps
没有。您也不会注意到rcs
(或sccs
),您可以注意到破折号在哪里是可选的,而选项值是可选的。
考虑到所有这些,GNU开发人员通过扩展getopt
以提供每个短选项的长版本,来适应其他系统中使用的关键字选项。例如,textutils 1.0 changelog说
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开发人员都互相复制选项名称)
-
技术上讲,该字符称为连字符。在大多数情况下,我们使用“破折号”一词指代破折号(-),有时也指代破折号(-),但都不是连字符(-)。