2017-03-28 1 views
1

다음 예제에서는 getopt이 아니라 xyz에서 오는 오류 메시지를 예상했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?getopt에 --name 인수를 사용하는 방법?

/tmp> getopt --name xyz --options "xyz:" -- -x 
-x -- 
/tmp> getopt --name xyz --options "xyz:" -- -x -z 
getopt: option requires an argument -- z 
-x -- 

어떻게 말합니까? xyz: option requires an argument -- z; 그게 뭐야 --name 무엇입니까?

UPDATE 버그 것 같다. 내 getopt는 cygwin에서 온다.

$ getopt --version 
getopt from util-linux 2.25.2 

답변

1

그것은 프로그램의 일부 버전에서 버그 인 것 같다. 그것은를 CentOS 7.3과 페도라 19

[vps1 ~]$ cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[vps1 ~]$ getopt --name xyz --options "xyz:" -- -x -z 
xyz: option requires an argument -- 'z' 
-x -- 
[vps1 ~]$ getopt -V 
getopt from util-linux 2.23.2 

에서의 나를 위해 작동하지만 (Windows 용 힘내에서) 내는 MinGW 쉘

$ getopt --name xyz --options "xyz:" -- -x -z 
getopt: option requires an argument -- z 
-x -- 
$ getopt -V 
getopt from util-linux 2.26.2 

업데이트하지 않습니다

: 그것은 작동 Linux의 2.27.1에서도 마찬가지입니다. Cygwin에서 (적어도 일부 버전에서는) 작동하지 않습니다. 따라서 문제는 Windows 포트 (Mingw와 Cygwin, 흥미롭게도)에있는 것 같습니다. /은을 사용 가지고, this commit 시도가 일부 environnments 처리 할 수 ​​있기 때문에 (하지 리눅스, 특히 BSD)를 getopt 프로그램 :

나는 추측 (대상 타격의 큰되지 확률)을 던질거야 getprogname/setprogname을 사용하여 argv[0] 대신에 "현재"프로그램 이름을 가져 오거나 설정하십시오.

#if defined (HAVE_SETPROGNAME) && !defined (__linux__) 
     setprogname(name); 

자,

  1. Cygwin와는 MinGW/MSI에 모두 해당 기능을 지원하는 것을 가정 해 봅시다.
  2. 그러나, 그들은 HAVE_SETPROGNAME, 문제를 바로 BSD 버전처럼, 또한
  3. 자신의 getopt 기능 (마음 당신,하지 프로그램)을 정의하는 경우 대신 argv[0]

getprogname를 사용하는 부족 설명 될 것이다. 그러나, 나는 회의적입니다 - 특히 3 번 지점.

+0

cygwin에서'getopt from util-linux 2.25.2'를 사용하고 있습니다. 최근 버그 또는 창과 관련이 있습니까? –

+0

오히려 나중에, 나는 (업데이 트라고) 말하고 싶지만 ... – leonbloy

+1

아마도 cygwin과 mingw 태그를 추가하여 몇몇 개발자를 유치 할 수 있습니다 ....? – leonbloy

0

이것은 util-linux 2.28commit 30fbf2f6으로 이미 고정되어있는 버그 (또는 이식성이없는 문제)입니다. 이 수정 이전에는 Linux, OSX 및 몇 가지 BSD 버전에서만 작동했지만 WIN32 또는 GNU-Hurd에서는 작동하지 않았습니다.

당신이 (창 구축하기 어려울 수 있습니다) util-linux를 업그레이드 할 수없는 경우에, 당신은이 쉘 해결 방법을 사용할 수 있습니다 여전히 다시 한 번 경우이 트릭을 무시할 것 --name 옵션을 사용하여

bash -c 'exec -a "XYZ" getopt --options "xyz:" -- -x -z' 

주 getopt는 언젠가 업데이트 될 것입니다.

물론 getopt 프로그램을 원하는 이름으로 복사/링크/이름을 바꿀 수도 있습니다.

관련 문제