다음과 같은 플래그와 매개변수가 포함된 명령이 있다고 가정해 보겠습니다.
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
쉘은 이 라이브러리 함수를 호출하여 내장 명령을 구현할 가능성이 높습니다.
getopts
IMHO, 쉘 스크립트와 getopt()
C 프로그램 에서 이를 사용하는 방법을 아는 것이 좋을 것입니다 . 별로 어렵지 않으며 프로젝트의 명령줄 구문 분석 코드를 작성할 때 작업이 훨씬 쉬워집니다.
getopt_long()
일부 C 라이브러리는 --option=value
"긴 옵션"( )을 구문 분석하는 기능도 제공합니다. 그러나 이것은 확장입니다(말장난 의도는 아님).
답변2
다음과 같은 것을 고려해보세요:
mycommand --foo=bar arg1 arg2
=<someval>
플래그에 값을 할당할 때의 요구 사항은 이를 명확하게 합니다.
분명히 이것은 값이 지정되지 않은 다른 경우입니다.
mycommand --foo arg1 arg2
답변3
이에 대한 일반적인 대답은 없습니다. 그것은 모두 mycommand
그 주장이 어떻게 해석되는지에 달려 있습니다. 예를 들어 인수 값으로 절대 나타나지 않는 제한된 수의 값만 허용하면 모호성을 명확하게 할 수 있으므로 mycommand
다음 명령줄 인수가 허용 가능한 값인지 확인하여 생략된 값을 쉽게 감지할 수 있습니다.foo
foo
foo