Я не думаю, что оболочка / утилиты в историческом Unix или в чем-то «недавнем», как 4.4BSD, поддерживали использование двойного тире (или двух последовательных дефисов) в качестве конца разделителя опций . В FreeBSD вы можете увидеть, например, заметку, представленную на 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, который ввел double-dash (
--
) в качестве конца разделителя опций в оболочках Unix? - Началось ли все это потому, что некоторые люди хотели использовать цифры в именах файлов
touch
в начале 90-х, а затем это происходило по частям по одной утилите за десятилетие? - О чем этот оживленный комментарий в журнале изменений?
- Когда Рекомендация 10 ( аргумент - должен быть принят в качестве разделителя, указывающего конец параметров. [...] ) введена в синтаксис служебной программы POSIX ?
1. В отличие от этого, т. Е. Документирование длинных опций во всех командах, используемых глобально, что не имеет никакого отношения. С другой стороны, вы можете увидеть ссылки на ограничителе появляются в чем - то вроде GNU rm.c в 2000 году в качестве комментария, перед тем , как подвергается конечному пользователю в 2005 году ( diagnose_leading_hyphen функции). Но это все гораздо позже и касается очень конкретного случая использования.
getopt
, поддерживает--
.getopt
был написан в начале 1980-х годов. Если кто-то может получить документ getopt от Uniforum '85, это может дать некоторую историю.--
.Ответы:
Насколько я могу судить, использование в
--
качестве маркера конца опций начинаетсяsh
иgetopt
в System III Unix (1980).Согласно этой истории семейства Bourne Shell , Bourne Shell впервые появилась в Версии 7 Unix (1979). Но это не есть способ для
set
чтобы отделить параметры от аргументов . Итак, оригинальная оболочка Bourne могла бы сделать:set -e
- включить режим выхода при ошибкеset arg1 arg2 ...
- устанавливает позиционные параметры$1=arg1
,$2=arg2
и т.д.Но:
set arg1 -e arg2
даст вам$1=arg1
,$2=arg2
и включить выход-на-ошибки . Упс.Система III Unix (1980) исправила эту ошибку и представила
getopt
. Согласноgetopt
справочной странице :Насколько я могу судить, это первое место, которое появляется.
Оттуда, кажется, что другие команды приняли
--
соглашение, чтобы разрешить неоднозначности разбора аргументов (такие как примеры сtouch
иrm
вы цитируете выше) в течение диких, нестандартных дней 1980-х.Некоторые из этих частичных усыновлений были кодифицированы в POSIX.1 (1988), отсюда и комментарий в журнале изменений о "POSIX-обязательном клудже".
Но только в POSIX.2 (1992) были приняты Рекомендации по синтаксису служебных программ , которые содержат знаменитое Руководство 10:
И вот откуда он превращается из «клуджа» в универсальную рекомендацию.
источник
getopt
не смог. Я буду читать больше об этом! Еще раз спасибо!