Коли і як було введено подвійний тире (-) як кінцевий роздільник параметрів у Unix / Linux?


49

Я не думаю, що оболонка / утиліти в історичному 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, який представив подвійний тире ( --) як кінець розмежувача параметрів у оболонках Unix?
  • Це все почалося через те, що деякі люди хотіли використовувати цифри у назви файлів touchна початку 90-х, а потім це продовжувалося поступово однією утилітою одночасно протягом десятиліття ??
  • Про що жвавий коментар у журналі змін?
  • Коли Керівний принцип 10 ( Аргумент. - повинно бути прийнято в якості роздільника , що вказує кінець опцій [...] ) вводяться в POSIX Utility Синтаксис ?

1. На відміну від цього, тобто документування довгих опцій у всіх командах, що використовуються в усьому світі, що не пов'язано. З іншого боку, ви можете побачити посилання на обмежувачі з'являються в чому - щось на зразок GNU rm.c 2000 року в якості коментаря, перед тим , як піддається кінцевому користувачеві в 2005 році ( diagnose_leading_hyphen функції). Але це все набагато пізніше і йдеться про дуже конкретний випадок використання.


1
Принаймні, BSD4.3RENO мав getoptпідтримку --.
Стефан Шазелас

@ StéphaneChazelas Ви також зробили коментар про те, що getopt не є єдиним api, здатним боротися з роздільником. Чи означає це, що це було передбачено та працювало до того, як воно фактично використовувалось ?? Боюся, що це поза мною. Дякую!

2
Він, ймовірно, використовувався на спеціальній основі декількома випадковими програмами, але, думаю, це вперше було задокументовано, коли getoptбуло написано на початку 1980-х. Якщо хтось може отримати папір для отримання від Uniforum '85, це може дати певну історію.
Марк Плотнік

2
@MarkPlotnick, насправді getopt, як це знайдено на підтримках SysIII (1980) --.
Стефан Шазелас

Відповіді:


38

Наскільки я можу сказати, використання --маркера кінцевих опцій починається з shі getoptв System III Unix (1980).

Згідно з цією історією сім'ї Борна Шелл , Борн Шелл вперше з'явився у версії 7 Unix (1979). Але це не є спосіб для setщоб відокремити параметри від аргументів . Отже, оригінальна оболонка Борна могла:

  • set -e - увімкнути режим виходу з помилки
  • set arg1 arg2 ...- встановлює позиційні параметри $1=arg1, $2=arg2і т.д.

Але: set arg1 -e arg2дасть вам $1=arg1, $2=arg2і включить помилку при виході . Уопс.

Система III Unix (1980) виправила цю помилку та представила getopt. Згідно getopt«S людини сторінці :

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.

Наскільки я можу сказати, це саме перше місце з’являється.

Звідси, здається, що інші команди прийняли --конвенцію для вирішення неоднозначностей розбору аргументів (наприклад, приклади з touchта, які rmви цитуєте вище) протягом диких, нестандартних днів 1980-х.

Деякі з цих усиновлень на частини були кодифіковані в POSIX.1 (1988), звідки походить коментар змін журналу про "потрібну POSIX лукавку".

Але лише до 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.

І саме тут йде шлях від "хитрості" до універсальної рекомендації.


Дякую, що знайшли час! Я в основному ігнорував getopt у своєму "дослідженні", оскільки не розумію, чому потрібна така абстрагована утиліта / функція. Тепер я прочитав, що це було переосмислено (getopts) в якийсь момент, щоб мати справу з пробілами тощо, оскільки sysv не getoptміг. Я детальніше про це прочитаю! Знову дякую!

5
Якщо ви не розумієте, чому корисна буде стандартна утиліта для розбору параметрів командного рядка, можливо, ви не спробували написати аналізатор оболонки для параметрів командного рядка? Це свого роду біль! Звичайно, було б добре, якби якийсь інший інструмент зробив це для мене ... Також майте на увазі: в 1980 році не було ні Python, ні Ruby, ні Java, ні Perl, ні PHP - навіть C ++ ще не було винайдено, і вся ідея "сценаріїв оболонок" була ще досить нова. Тож ідея стандартного аналізатора командного рядка була все ще досить новою!
wwoods
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.