이중 대시 (-)가 유닉스 / 리눅스에서 옵션 구분 기호로 언제 어떻게 도입 되었습니까?


49

역사적 유닉스 의 쉘 / 유틸리티 나 옵션 구분 기호끝으로 이중 대시 (또는 두 개의 연속 하이픈)를 사용하여 4.4BSD가 지원하는 "최근"의 생각은 없습니다 . 로 FreeBSD의 , 당신은 인스턴스에 대한 도입 메모 볼 수 있습니다 2.2.1 릴리스 (1997). 그러나 이것은 하나의 명령에 대한 문서 일뿐입니다.rm

내가 찾을 수 있는 가장 오래된 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.

이것은 리눅스 이전의 것이다. 기존 파일에 타임 스탬프를 지정하는 대신 시간 사양 과 동일한 자릿수 (10 또는 10 자리 10 진수)를 포함하는 이름의 파일을 만들 수 있다는 사실을 분명히 설명 합니다.


  • 그렇다면 posix.1 은 유닉스 쉘에서 옵션 구분 기호-- 으로 이중 대시 ( ) 를 도입 했습니까?
  • 일부 사람들은 touch90 년대 초 에 파일 이름에 숫자를 사용하기를 원했기 때문에이 모든 것이 시작 되었습니까? 그리고 이것은 10 년 동안 한 번에 하나의 유틸리티로 단편적인 방식으로 진행 되었습니까 ?
  • 변경 로그에 대한 언급이 무엇입니까?
  • 가이드 라인 10 ( 인수 -. 옵션의 끝을 나타내는 구분 기호로 인정해야한다 [...] )을 POSIX에 도입 유틸리티 구문 ?

1. 반대로 문서화, 즉 긴 옵션 관련이 세계적으로 모든 명령 사용량을. 반면에, 당신은 구분 기호를 참조 볼 수 표시 같은에서 GNU의 rm.c 되기 전에, 주석으로 2000 년에 노출 된 2005 년 최종 사용자에게합니다 ( diagnose_leading_hyphen의 기능). 그러나 이것은 훨씬 나중에이며 매우 구체적인 사용 사례에 관한 것입니다.


1
BSD4.3RENO는 적어도 getopt지원되는 것을 가지고 있었다 --.
Stéphane Chazelas

@ StéphaneChazelas는 또한 만든 주석 에 대한 getopt는이 구분을 처리 할 수있는 유일한 API되지 않는합니다. 이것이 실제로 사용되기 전에 제공되고 작동했음을 의미합니까? 나는 이것이 나를 넘어서서 두렵다. 감사합니다!

2
아마도 임의의 여러 프로그램에 의해 임시로 사용되었지만 아마도 getopt1980 년대 초에 작성 되었을 때 처음으로 문서화되었다고 생각합니다 . 누군가 Uniforum '85에서 getopt 용지를 얻을 수 있다면 역사가있을 수 있습니다.
Mark Plotnick

2
@MarkPlotnick, 실제로 SysIII (1980)에서 찾은 getopt는을 지원합니다 --.
Stéphane Chazelas

답변:


38

지금까지 내가 말할 수있는, 사용 --끝 옵션 마커로 시작으로 sh하고 getopt시스템 III 유닉스 (1980)에서.

Bourne Shell 제품군의 이력에 따르면 Bourne Shell 은 버전 7 Unix (1979) 에 처음 등장했습니다 . 그러나 옵션과 인수분리 하는 방법은 없었습니다 . 따라서 원래 Bourne 쉘은 다음을 수행 할 수 있습니다.set

  • set -e -오류 발생시 종료 모드를 켭니다
  • set arg1 arg2 ...- 파라미터 세트의 위치 $1=arg1, $2=arg2등을

그러나 : set arg1 -e arg2당신을 줄 것이다 $1=arg1, $2=arg2그리고 출구에 오류를 켭니다 . 으악.

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.

내가 알 수있는 한, 그것이 가장 먼저 나타납니다.

거기에서, 다른 명령이 채택 된 것으로 보인다 --인수 구문 분석 모호성 해결하기 위해 규칙 (예와 예제 등을 touch하고 rm야생을 통해 1980 년대, 비표준 일 위에서 인용).

이러한 단편적 채택 중 일부는 POSIX.1 (1988) 에서 체계화되었으며 , 여기서 "POSIX- 필수 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.

그리고 그것이 "kludge"에서 보편적 인 권고로가는 곳입니다.


시간 내 주셔서 감사합니다! 나는 왜 그런 종류의 추상화 된 유틸리티 / 기능이 필요한지 이해하지 못하기 때문에 "연구"에서 getopt를 대부분 무시했다. 이제 나는 이것이 sysv가 할 수 없었던 공백 등을 다루기 위해 어떤 시점에서 재정의 된 것을 읽었습니다 (getopts)getopt . 나는 그것에 대해 더 읽을 것이다! 다시 감사합니다!

5
명령 행 옵션을 구문 분석하기위한 표준 유틸리티가 유용한 이유를 이해하지 못하면 명령 행 옵션을 위해 쉘 구문 분석기를 작성하지 않았습니까? 일종의 고통입니다! 1980 년대에 파이썬, 루비, 자바, 펄, PHP가 없었으며 C ++조차도 아직 발명되지 않았으며 "쉘 스크립팅"에 대한 모든 아이디어는 여전히 새롭습니다. 따라서 표준 명령 줄 파서에 대한 아이디어는 여전히 참신했습니다!
wwoods
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.