플래그와 명령 매개변수를 분리하세요.

플래그와 명령 매개변수를 분리하세요.

다음과 같은 플래그와 매개변수가 포함된 명령이 있다고 가정해 보겠습니다.

mycommand --foo bar arg1 arg2

( foo이 플래그의 값은 입니다 "bar".)

하지만 foo인수 없이 플래그를 제공할 수 있는 옵션이 있다면 어떨까요?

mycommand --foo arg1 arg2

arg1값이 플래그로 처리되는 것을 방지하는 방법은 무엇입니까 foo?

답변1

Unix에서 명령줄 플래그를 나머지 인수와 구분하는 가장 일반적인 관용구는 이중 대시( --)를 사용하는 것입니다.

유틸리티가 C 라이브러리 기능을 getopt()(직접 또는 간접적으로) 사용하는 경우 이중 대시는 명령줄 옵션의 끝을 나타내고 getopt()명령줄 구문 분석을 종료합니다.

이것은에서 온 것입니다getopt(3)수동OpenBSD에서:

인수 목록의 옵션 해석은 "--"(이중 대시) 옵션을 사용하여 억제할 수 있습니다. 이는 getopt()가 인수 처리 종료 신호를 보내고 -1을 반환하도록 합니다.

그렇기 때문에 이름이 지정된 파일을 삭제하는 올바른 방법은 다음과 -f같습니다.

$ rm -- -f

예를 들어.

getopts쉘은 이 라이브러리 함수를 호출하여 내장 명령을 구현할 가능성이 높습니다.

getoptsIMHO, 쉘 스크립트와 getopt()C 프로그램 에서 이를 사용하는 방법을 아는 것이 좋을 것입니다 . 별로 어렵지 않으며 프로젝트의 명령줄 구문 분석 코드를 작성할 때 작업이 훨씬 쉬워집니다.

getopt_long()일부 C 라이브러리는 --option=value"긴 옵션"( )을 구문 분석하는 기능도 제공합니다. 그러나 이것은 확장입니다(말장난 의도는 아님).

답변2

다음과 같은 것을 고려해보세요:

mycommand --foo=bar arg1 arg2

=<someval>플래그에 값을 할당할 때의 요구 사항은 이를 명확하게 합니다.

분명히 이것은 값이 지정되지 않은 다른 경우입니다.

mycommand --foo arg1 arg2

답변3

이에 대한 일반적인 대답은 없습니다. 그것은 모두 mycommand그 주장이 어떻게 해석되는지에 달려 있습니다. 예를 들어 인수 값으로 절대 나타나지 않는 제한된 수의 값만 허용하면 모호성을 명확하게 할 수 있으므로 mycommand다음 명령줄 인수가 허용 가능한 값인지 확인하여 생략된 값을 쉽게 감지할 수 있습니다.foofoofoo

관련 정보