History

雙破折號 (–) 何時以及如何作為 Unix/Linux 中的選項結束符引入的?

  • August 1, 2014

我不認為歷史Unix 中的 shell/實用程序以及像4.4BSD那樣“最新”的東西都不支持使用雙破折號(或兩個連續的連字元)作為選項 delimiter 的結尾。使用FreeBSD,您可以看到例如2.2.1 版本(1997)的rm 聯機幫助頁中介紹的註釋。但這只是一個命令的文件。

查看我能找到的最古老的GNU fileutils 更改日誌,我看到了這個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中引入了雙破折號 ( --) 作為選項定界符的結尾嗎?
  • 這一切是否都是因為有些人想在touch90 年代初在文件名中使用數字而開始的,然後這種情況以一種零碎的方式持續了十年,一次一個實用程序?
  • 更新日誌中的激烈評論是關於什麼的?
  • 準則 10何時發布(參數 – 應被接受為指示選項結束的分隔符。$$ … $$) 引入 POSIX實用程序語法

  1. 相反,即記錄全域所有命令使用中的長選項,這是不相關的。另一方面,您可以看到對分隔符的引用在 2000 年作為註釋出現GNU rm.c中,然後在 2005 年暴露給最終使用者(diagnose_leading_hyphen函式)。但這一切都晚了很多,而且是關於一個非常具體的案例。

據我所知,作為 end-of-options-marker 的使用始於--System III Unix(1980)。sh``getopt

根據Bourne Shell 家族的這段歷史, Bourne Shell最早出現在版本 7 Unix(1979)中。但它沒有辦法setoptions 與 arguments 分開。所以原來的 Bourne shell 可以這樣做:

  • set -e- 打開錯誤退出模式
  • set arg1 arg2 ...- 設置位置參數$1=arg1$2=arg2等。

但是:set arg1 -e arg2會給你$1=arg1, $2=arg2, 並打開 exit-on-error。哎呀。

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

據我所知,這是它出現的第一個地方。

從那裡開始,似乎其他命令在 1980 年代的狂野、無標準的日子裡採用了該--約定來解決參數解析歧義(例如上面引用的範例)touchrm

其中一些零碎的採用被編入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.

這就是它從“雜牌”到普遍推薦的地方。

引用自:https://unix.stackexchange.com/questions/147143