雙破折號 (–) 何時以及如何作為 Unix/Linux 中的選項結束符引入的?
我不認為歷史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中引入了雙破折號 (
--
) 作為選項定界符的結尾嗎?- 這一切是否都是因為有些人想在
touch
90 年代初在文件名中使用數字而開始的,然後這種情況以一種零碎的方式持續了十年,一次一個實用程序?- 更新日誌中的激烈評論是關於什麼的?
- 準則 10何時發布(參數 – 應被接受為指示選項結束的分隔符。$$ … $$) 引入 POSIX實用程序語法?
據我所知,作為 end-of-options-marker 的使用始於
--
System III Unix(1980)。sh``getopt
根據Bourne Shell 家族的這段歷史, Bourne Shell最早出現在版本 7 Unix(1979)中。但它沒有辦法
set
將options 與 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 年代的狂野、無標準的日子裡採用了該
--
約定來解決參數解析歧義(例如上面引用的範例)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.
這就是它從“雜牌”到普遍推薦的地方。