역사적 유닉스 의 쉘 / 유틸리티 나 옵션 구분 기호 의 끝으로 이중 대시 (또는 두 개의 연속 하이픈)를 사용하여 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 은 유닉스 쉘에서 옵션 구분 기호
--
의 끝 으로 이중 대시 ( ) 를 도입 했습니까? - 일부 사람들은
touch
90 년대 초 에 파일 이름에 숫자를 사용하기를 원했기 때문에이 모든 것이 시작 되었습니까? 그리고 이것은 10 년 동안 한 번에 하나의 유틸리티로 단편적인 방식으로 진행 되었습니까 ? - 변경 로그에 대한 언급이 무엇입니까?
- 때 가이드 라인 10 ( 인수 -. 옵션의 끝을 나타내는 구분 기호로 인정해야한다 […] )을 POSIX에 도입 유틸리티 구문 ?
1. 반대로 이 문서화, 즉 긴 옵션 관련이 세계적으로 모든 명령 사용량을. 반면에, 당신은 구분 기호를 참조 볼 수 표시 같은에서 GNU의 rm.c 되기 전에, 주석으로 2000 년에 노출 된 2005 년 최종 사용자에게합니다 ( diagnose_leading_hyphen의 기능). 그러나 이것은 훨씬 나중에이며 매우 구체적인 사용 사례에 관한 것입니다.
답변
지금까지 내가 말할 수있는, 사용 --
끝 옵션 마커로 시작으로 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”에서 보편적 인 권고로가는 곳입니다.