Unix/Linux 中何时以及如何引入双破折号 (--) 作为选项分隔符的结束符?

Unix/Linux 中何时以及如何引入双破折号 (--) 作为选项分隔符的结束符?

我不认为外壳/实用程序历史的Unix 也不在“最近”的东西中4.4BSD支持使用双破折号(或两个连续的连字符)作为选项分隔符结束。和自由BSD,您可以看到例如在rm 联机帮助页2.2.1 发布(1997)。但这只是一个命令的文档。

看着最老的GNU 文件工具 变更日志我可以找到,我看到这个1(稍作修改):

Tue Aug 28 18:05:24 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

* touch.c (main): Don't interpret first non-option arg as a   <---
  time if `--' is given (POSIX-required kludge).  
* touch.c: Add long-named options.
* Many files: Include <getopt.h> instead of "getopt.h" since
  getopt.h will be in the GNU /usr/include.
* install.c: Declare some functions.
* touch.c, getdate.y, posixtime.y, mktime.c: New files, from bin-src.
* posixtime.y: Move year from before time to after it (but
  before the seconds), for 1003.2 draft 10.

这早于Linux。显然是考虑到您可能想要创建一个名称包含与时间相同位数的文件的事实规格(八位或十位十进制数)-而不是为现有文件指定时间戳...


  • 也是如此POSIX.1其中引入了双破折号 ( --) 作为选项结束分隔符在 Unix shell 中?
  • 这一切都是因为一些人想touch在 90 年代初在文件名中使用数字而开始的,然后这种情况以一次一个实用程序的零碎方式持续了十年?
  • 变更日志中的激烈评论是关于什么的?
  • 什么时候指南 10参数 -- 应该被接受作为指示选项结束的分隔符。[...]) 引入 POSIX实用语法

1. 相对于即记录长选项在全局使用的所有命令中,这是不相关的。另一方面,您可以看到对分隔符的引用出现在类似的事情中GNU rm.c2000年作为评论,之前裸露2005 年向最终用户(诊断前导连字符功能)。但这都是很久以后的事了,而且是关于一个非常具体的用例。

答案1

--据我所知,作为选项结束标记的使用始于System III Unix (1980) 中的sh和。getopt

根据这个Bourne Shell 家族的历史,伯恩外壳第一的出现在版本 7 Unix(1979)。但它没有办法set办法将选项与参数分开。所以最初的 Bourne shell 可以这样做:

  • set -e- 打开错误退出模式
  • set arg1 arg2 ...- 设置位置参数$1=arg1$2=arg2等等。

但是:set arg1 -e arg2会给你$1=arg1, $2=arg2, 和打开错误退出。哎呀。

系统III Unix(1980) 修复了该错误并引入了getopt.根据getopt手册页:

NAME
   getopt - parse command options

SYNOPSIS
   set -- `getopt optstring $∗`

DESCRIPTION
   Getopt is used to break up options in command lines for easy parsing by
   shell procedures, and to check  for  legal  options.   Optstring  is  a
   string  of  recognized  option letters (see getopt(3C)); if a letter is
   followed by a colon, the option is expected to have an  argument  which
   may or may not be separated from it by white space.  The special option
   -- is used to delimit the end of the options.  Getopt will place --  in
   the  arguments  at  the  end  of  the  options, or recognize it if used
   explicitly.  The shell arguments ($1 $2 . . .) are reset so  that  each
   option  is  preceded  by a - and in its own shell argument; each option
   argument is also in its own shell argument.

据我所知,这就是第一的它出现的地方。

从那时起,在 20 世纪 80 年代狂野、无标准的日子里,其他命令似乎都采用了该--约定来解决参数解析歧义(例如上面引用的touch和的示例)。rm

其中一些零碎的收养被编入法典POSIX.1(1988),这就是关于“POSIX-required kludge”的变更日志评论的来源。

但直到POSIX.2(1992)认为实用程序语法指南被采纳,其中包含著名的准则 10:

Guideline 10:    The argument "--" should be accepted as a delimiter
                 indicating the end of options.  Any following
                 arguments should be treated as operands, even if they
                 begin with the '-' character.  The "--" argument
                 should not be used as an option or as an operand.

这就是它从“拼凑”变成普遍推荐的地方。

相关内容