옵션

getopt

getopt는 Unix/POSIX 스타일의 명령줄 옵션을 해석하기 위해 사용되는 C 라이브러리 함수입니다.이것은 POSIX 사양의 일부이며 Unix 계열 시스템에 보편적입니다.

셸 스크립트에서 명령줄 인수를 구문 분석하는 UNIX 프로그램의 이름이기도 합니다.

역사

명령줄 프로그램의 오랜 문제는 옵션 지정 방법이었지만 초기 프로그램에서는 단일 문자 옵션 등 다양한 방법을 사용했습니다.-a, 여러 옵션을 함께 지정( ).-abc와 동등하다-a -b -c, 다중 문자 옵션( )-inum), 인수 포함 옵션(-a arg,-inum 3,-a=arg, 및 다른 프리픽스 문자(-a,+b,/c).

getopt 함수는 모든 프로그램이 명령줄 옵션을 해석하기 위해 사용할 수 있는 표준 메커니즘으로 작성되어 모든 사람이 의존할 수 있는 공통 인터페이스가 있습니다.이와 같이 원저자들은 단일 문자 옵션, 함께 지정된 다중 옵션 및 인수가 있는 옵션에 대한 변형 지원에서 선택하였다.-a arg또는-aarg모두 옵션 문자열로 제어할 수 있습니다.

getopt는 적어도[1] 1980년으로 거슬러 올라가며, AT&T가 1985년 텍사스 주 댈러스에서 열린 UNIFORM 회의에서 공개 [citation needed]도메인에서 사용할 수 있도록 하기 위해 처음 출판되었습니다.그 후 다른 버전의 Unix (4.3)에 의해 그 버전이 선택되었습니다.BSD, Linux 등).POSIX.2 표준unistd의 일부로 지정되어 있습니다.h 헤더 파일getopt의 파생상품은 명령줄 옵션을 구문 분석하는 많은 프로그래밍 언어에 대해 작성되었습니다.

내선번호

getopt는 시스템에 의존하는 함수이며 동작은 C 라이브러리의 구현에 따라 달라집니다.단,[2] gnulib와 같은 일부 커스텀 구현은 사용할 수 있습니다.

기존의 (POSIX 및 BSD) 처리에서는 첫 번째 non-option 인수가 발생했을 때 옵션이 종료되고 getopt는 이를 시그널링하기 위해 -1을 반환합니다.단, glibc 확장에서는 사용하기 쉽도록 임의의 옵션이 허용됩니다.getopt는 인수 벡터를 암묵적으로 허용하여 최종적으로 비옵션을 남깁니다.POSIX는 이미 -1을 반환하는 규칙을 가지고 있기 때문에--또한 생략하면 언제든지 휴대할 수 있는 [2]end-of-time ignifier로 사용할 수 있습니다.

GNU 확장자 getopt_long사용하면 읽기 쉬운 다중 문자 옵션을 구문 분석할 수 있습니다.이 옵션은 하나의 대시가 아닌 두 개의 대시에 의해 도입됩니다.2개의 대시 중에서 선택할 수 있는 것은, 멀티 문자 옵션입니다( ).--inum를 조합하여 지정한 단일 문자 옵션과 구별합니다( ).-abc). GNU 확장에서는 다음 인수를 사용하는 옵션에 대한 대체 형식도 사용할 수 있습니다.--name=arg이 인터페이스는 널리 보급되어 FreeB를 포함한 많은 BSD 디스트리뷰션에서 사용되고 있습니다.[2]SD [3]및 Solaris.긴 옵션을 지원하는 다른 방법은 Solaris 및 Korn Shell(확장 optstring)에서 볼 수 있지만 그다지 [4]인기가 없었습니다.

getopt의 또 다른 일반적인 고급 확장 기능은 인수 해석 상태를 리셋하는 것입니다.이것은 옵션인 임의의 소프트웨어 GNU 확장을 대체하거나 다른 레벨의 다른 옵션을 사용하여 명령줄 인터페이스 세트를 "레이어"하는 방법으로 유용합니다.이것은 옵트셋 변수를 사용하는 BSD 시스템과 Optind를 [2]0으로 설정하면 GNU 시스템에서 실현됩니다.

에 공통되는 기능getoptgetsubopt. 쉼표로 구분된 하위 [5]옵션의 문자열을 구문 분석합니다.

사용.

사용자용

getopt 기반 프로그램의 명령줄 구문은 POSIX에서 권장하는 유틸리티 인수 구문입니다.요컨대:[6]

  • 옵션에는, 1 문자의 영숫자 앞에,-(진행자) 문자
  • 옵션에는 필수 또는 임의 인수를 사용할 수 있습니다.
  • 옵션이 인수를 사용하도록 지정하려면 include를 지정합니다.:옵션 이름 뒤에 있음(초기 지정 시에만 해당)
  • 옵션에서 인수를 사용하는 경우, 같은 토큰 또는 다음 토큰으로 지정할 수 있습니다.바꿔 말하면, 만약o주장을 받아들이다-ofoo와 같다-o foo.
  • 마지막 옵션이 아닌 옵션이 인수를 사용하지 않는 한 여러 옵션을 함께 연결할 수 있습니다.한다면a그리고.b의론을 일절 받아들이지 않다e옵션 인수를 사용합니다.-abe와 같다-a -b -e,그렇지만-bea같지 않다-b -e a이전 규칙 때문에.
  • 모든 옵션은 non-option 인수 앞에 있습니다(GNU 확장자 제외). --항상 옵션의 끝을 표시합니다.

구문의 확장에는 GNU 규약과 Sun의 [7][8]사양이 포함됩니다.

프로그래머용

GNU의 getopt 매뉴얼에서는 getopt의 [9]용도를 다음과 같이 지정하고 있습니다.

#실패하다 <리스트 없음.h>  인트 옵션(인트 argc,  * 컨스턴트 argv[],            컨스턴트  *옵트스트링); 

여기서 argcargvC의 주요 함수 프로토타입과 동일하게 정의된다.즉, argc는 argv 배열 문자열의 길이를 나타낸다.optstring 에는, 검색하는 옵션(W 를 제외한 통상의 영숫자) 및 인수(콜론)를 받아들이는 옵션의 지정이 포함되어 있습니다.예를 들어 "vf::o:"는 인수 없는 v, 옵션 인수 f 및 필수 인수 o의 세 가지 옵션을 나타냅니다.여기서 GNU는 긴 옵션 동의어를 [9]위한 W 확장자를 구현합니다.

getopt 자체는 옵션 문자 또는 [9]엔드의 경우 -1인 정수를 반환합니다.이 용어의 의미는 while-loop을 사용하여 옵션을 검토하고 switch-case 문을 사용하여 옵션을 선택하고 조작하는 것입니다.이 문서의 예시 섹션을 참조하십시오.

프로그램에 대한 추가 정보를 전달하려면 몇 가지 글로벌한 정보를extern변수는 프로그램에서 정보를 가져오기 위해 참조됩니다.getopt:

외부  *옵타그; 외부 인트 optind(옵션), 오퍼러, 옵트; 
옵타그
현재 옵션의 인수에 대한 포인터(존재하는 경우).구문 분석을 시작할 위치를 제어하는 데 사용할 수 있습니다(다시).
optind(옵션)
여기서 getopt는 현재 argv에서 보고 있습니다.
오퍼러
getopt에서 오류 메시지를 출력할지 여부를 제어하는 부울 스위치.
옵트
인식되지 않는 옵션이 발생하면 인식되지 않는 문자의 값입니다.

GNU 확장 getopt_long 인터페이스는 다른 헤더 파일에 속하며 긴 옵션과 추가 컨트롤의 "짧은" 이름을 정의하는 추가 옵션을 사용합니다.짧은 이름이 정의되지 않은 경우 getopt는 대신 [9]옵션 구조를 참조하는 인덱스를 longindex 포인터에 넣습니다.

#실패하다 <getopt(옵션)>h>  인트 getopt_long(인트 argc,  * 컨스턴트 argv[],                 컨스턴트  *옵트스트링,                 컨스턴트 구조 선택 *롱옵트, 인트 *롱 인덱스); 

POSIX 표준 getopt 사용

#실패하다 <stdio.h>printf */의 경우 /* #실패하다 <stdlib.h>/*(종료 */) #실패하다 <리스트 없음.h>getopt*의 경우 /*/ 인트 주된 (인트 argc,  **argv) {     인트 c;     인트 digit_optind = 0;     인트 옵션 = 0, 밧토 = 0;      *콥트 = 0, *도프 = 0;     하는 동안에 ((c = 옵션(argc, argv, "파일:d:012")) != -1) {         인트 this_option_optind = optind(옵션) ? optind(옵션) : 1;         전환하다 (c) {         사례. '0':         사례. '1':         사례. '2':             한다면 (digit_optind != 0 & & digit_optind != this_option_optind) {                 인쇄물 ("두 개의 다른 argv-module에서 발생합니다.\n");             }             digit_optind = this_option_optind;             인쇄물 ("옵션 %c\n", c);             브레이크.;         사례. 'a':             인쇄물 ("옵션 a\n");             옵션 = 1;             브레이크.;         사례. 'b':             인쇄물 ("옵션 b\n");             밧토 = 1;             브레이크.;         사례. 'c':             인쇄물 ("값 '%s'의 옵션 c"\n", 옵타그);             콥트 = 옵타그;             브레이크.;         사례. 'd':             인쇄물 ("값 '%s'의 옵션 d"\n", 옵타그);             도프 = 옵타그;             브레이크.;         사례. '?':             브레이크.;         체납:             인쇄물 (--getopt는 문자 코드 0%o를 반환했습니다.\n", c);         }     }     한다면 (optind(옵션) < > argc) {         인쇄물 ("비옵션 ARGV 요소: ");         하는 동안에 (optind(옵션) < > argc) {             인쇄물 (%s, argv[optind(옵션)++]);         }         인쇄물 ("\n");     }     퇴장 (0); } 

GNU 확장 getopt_long 사용

#실패하다 <stdio.h>printf */의 경우 /* #실패하다 <stdlib.h>/*(종료 */) #실패하다 <getopt(옵션)>h>/*(getopt_long의 경우). POSIX 표준 getopt는 unistd.h */ 입니다. 인트 주된 (인트 argc,  **argv) {     인트 c;     인트 digit_optind = 0;     인트 옵션 = 0, 밧토 = 0;      *콥트 = 0, *도프 = 0;     정적인 구조 선택 long_filength(긴 길이)[] = {     /* NAME 인수 플래그 단축 이름 */         {「추가",     required_module(필수), 특수한 순서, 0},         {"실패",  no_displaces(노_displictes),       특수한 순서, 0},         {"삭제",  required_module(필수), 특수한 순서, 0},         {"자세히", no_displaces(노_displictes),       특수한 순서, 0},         {'작성",  required_module(필수), 특수한 순서, 'c'},         {"파일,    required_module(필수), 특수한 순서, 0},         {특수한 순서,      0,                 특수한 순서, 0}     };     인트 option_index = 0;     하는 동안에 ((c = getopt_long(argc, argv, "파일:d:012",                  long_filength(긴 길이), &option_index)) != -1) {         인트 this_option_optind = optind(옵션) ? optind(옵션) : 1;         전환하다 (c) {         사례. 0:             인쇄물 ("옵션 %s", long_filength(긴 길이)[option_index].이름.);             한다면 (옵타그) {                 인쇄물 (" arg %s 포함", 옵타그);             }             인쇄물 ("\n");             브레이크.;         사례. '0':         사례. '1':         사례. '2':             한다면 (digit_optind != 0 & & digit_optind != this_option_optind) {                 인쇄물 ("두 개의 다른 argv-module에서 발생합니다.\n");             }             digit_optind = this_option_optind;             인쇄물 ("옵션 %c\n", c);             브레이크.;         사례. 'a':             인쇄물 ("옵션 a\n");             옵션 = 1;             브레이크.;         사례. 'b':             인쇄물 ("옵션 b\n");             밧토 = 1;             브레이크.;         사례. 'c':             인쇄물 ("값 '%s'의 옵션 c"\n", 옵타그);             콥트 = 옵타그;             브레이크.;         사례. 'd':             인쇄물 ("값 '%s'의 옵션 d"\n", 옵타그);             도프 = 옵타그;             브레이크.;         사례. '?':             브레이크.;         체납:             인쇄물 (--getopt는 문자 코드 0%o를 반환했습니다.\n", c);         }     }     한다면 (optind(옵션) < > argc) {         인쇄물 ("비옵션 ARGV 요소: ");         하는 동안에 (optind(옵션) < > argc) {             인쇄물 (%s, argv[optind(옵션)++]);         }         인쇄물 ("\n");     }     퇴장 (0); } 

셸 내

셸 스크립트 프로그래머는 일반적으로 일관된 옵션 제공 방법을 원합니다.이 목표를 달성하기 위해, 그들은 getopts에 의지하고 그것을 그들 자신의 언어로 옮기려고 한다.

포팅의 첫 번째 시도는 Unix System Laboratories(USL)에 의해 구현된 getopt 프로그램입니다.이 버전에서는 인용을 시도하지 않았기 때문에 인용 및 셸 메타문자를 처리할 수 없었습니다.FreeBSD로 [10]상속되었습니다.

1986년 USL은 메타캐릭터와 공백에 대한 안전하지 않은 것을 더 이상 받아들일 수 없다고 판단하고 대신 Unix SVR3 Bourne Shell용 builtin getopts 명령을 만들었습니다.셸에 명령어를 내장하는 장점은 셸 변수에 액세스할 수 있게 되었기 때문에 값을 따옴표 없이 안전하게 쓸 수 있습니다.셸 자체 변수를 사용하여 현재 및 인수 위치인 OPTIND OPTARG의 위치를 추적하고 셸 변수에 옵션 이름을 반환합니다.

1995년에getopts는 싱글 UNIX 사양 버전1 / X/Open Portability Guidelines [11]제4호에 기재되어 있습니다.현재 POSIX 쉘 표준의 일부인 getopts는 POSIX에 준거하기 위해 많은 다른 셸에서 널리 퍼져 있습니다.

getopt은 util-linux가 이전 getopt의 모든 문제를 이스케이프함으로써 수정한 향상된 버전을 출시할 까지 기본적으로 잊혀졌습니다.또한 GNU의 긴 옵션 [12]이름도 지원합니다.한편, 긴 옵션이 구현되는 경우는 거의 없습니다.getoptsksh93은 예외입니다.

기타 언어

getopt는 일반적인 POSIX 명령어인수 구조를 간결하게 기술한 것으로, 자신과 명령줄상의 유저에게 같은 인터페이스를 제공하려고 하는 프로그래머에 의해서 광범위하게 복제됩니다.

  • C: POSIX 이외의 시스템은 출하되지 않습니다.getopt그러나 [13]gnulib[2] MinGW(둘 다 GNU 스타일 사용 가능) 및 일부 최소 라이브러리를 사용하여 기능을 제공할 수 있습니다.대체 인터페이스도 존재합니다.
    • poptRPM 패키지 매니저가 사용하는 라이브러리는 재진입할 수 있다는 추가적인 장점이 있습니다.
    • argpglibc 및 gnulib의 함수 패밀리는 더 많은 편의성과 모듈성을 제공합니다.
  • D 프로그래밍 언어: D 표준 라이브러리에 getopt 모듈이 있습니다.
  • Go: 에 부속되어 있습니다.flag패키지:[14] 긴 플래그 이름을 사용할 수 있습니다.getopt패키지는 C 함수에 가까운 처리를 지원합니다.또 있다getopt원래의 POSIX에 훨씬 가까운 인터페이스를 제공하는 패키지입니다.
  • Haskell: 시스템에 포함되어 있습니다.콘솔GetOpt - 기본적으로 GNU getopt 라이브러리의 [17]Haskell 포트입니다.
  • Java: Java 표준 라이브러리에는 getopt 구현이 없습니다.gnu.getopt를 포함한 몇 가지 오픈소스 모듈이 있습니다.GNU getopt [18]Apache Commons [19]CLI에서 포트되는 Getopt.
  • Lisp: 공통 표준 라이브러리가 없는 다양한 방언이 있습니다.Lisp의 일부 방언에 대한 getopt의 서드파티 구현이 있습니다.Common Lisp는 서드파티의 구현이 두드러집니다.
  • Free Pascal: GetOpts라는 이름의 표준 유닛 중 하나로 자체 구현되어 있습니다.모든 플랫폼에서 지원됩니다.
  • Perl 프로그래밍 언어: 표준 라이브러리에 getopt의 두 가지 파생 버전이 있습니다: Getopt::Long[20] 및 Getopt:표준.[21]
  • PHP: getopt [22]기능이 있습니다.
  • Python: C의 getopt [23]및 GNU 확장자에 기반한 모듈을 표준 라이브러리포함합니다.Python의 표준 라이브러리에는 [24][25]보다 사용하기 편리한 옵션을 구문 분석할 수 있는 다른 모듈도 포함되어 있습니다.
  • Ruby: 표준 라이브러리 GetoptLong에 getopt_long이 구현되어 있습니다.또한 Ruby는 표준 라이브러리에 보다 정교하고 편리한 인터페이스를 갖춘 모듈을 가지고 있습니다.원래의 getopt 인터페이스의 서드파티 실장을 이용할 수 있습니다.
  • .NET Framework: 표준 라이브러리에 getopt 기능이 없습니다.서드파티제의 실장을 이용할 [26]수 있습니다.

레퍼런스

  1. ^ ftp://pdp11.org.ru/pub/unix-archive/PDP-11/Distributions/usdl/SysIII/[영구 데드링크]
  2. ^ a b c d e "getopt". GNU Gnulib. Retrieved 23 January 2020.
  3. ^ getopt_long(3)FreeBSD 라이브러리 기능 매뉴얼
  4. ^ "getopt(3)". Oracle Solaris 11.2 Information Library.
  5. ^ getsubopt(3)FreeBSD 라이브러리 기능 매뉴얼
  6. ^ "Utility Conventions". POSIX.1-2018.
  7. ^ "Argument Syntax". The GNU C Library. Retrieved 24 January 2020.
  8. ^ David-John, Burrowes; Kowalski III, Joseph E. (22 Jan 2003). "CLIP Specification, Version 1.0, PSARC 1999/645" (PDF).
  9. ^ a b c d getopt(3)Linux 라이브러리 함수 매뉴얼
  10. ^ getopt(1)FreeBSD 일반 명령어 매뉴얼
  11. ^ "getopts". The Open Group (POSIX 2018).
  12. ^ getopt(1)Linux 사용자 매뉴얼– 사용자 명령어
  13. ^ "visual studio - getopt.h: Compiling Linux C-Code in Windows". Stack Overflow.
  14. ^ "Package flag".
  15. ^ "Package getopt".
  16. ^ "Package getopt".
  17. ^ "System.Console.GetOpt".
  18. ^ "Class gnu.getopt.Getopt". Retrieved 2013-06-24.
  19. ^ "Commons CLI". Apache Commons. Apache Software Foundation. February 27, 2013. Retrieved June 24, 2013.
  20. ^ "Getopt::Long - perldoc.perl.org".
  21. ^ "Getopt::Std - perldoc.perl.org".
  22. ^ "PHP: getopt - Manual".
  23. ^ "16.5. getopt — C-style parser for command line options — Python 3.6.0 documentation".
  24. ^ "Parser for command line options". Retrieved 2013-04-30. 버전 2.7 이후 권장되지 않음
  25. ^ "Parser for command-line options, arguments and sub-commands". Retrieved 2013-04-30.
  26. ^ "GNU Getopt .NET".

외부 링크