왜 "인수는 반대 옵션을 억제할 수 있습니다"가 "인수는 항상 분리되어 있습니다"보다 우선합니까?

왜 "인수는 반대 옵션을 억제할 수 있습니다"가 "인수는 항상 분리되어 있습니다"보다 우선합니까?

최근 이슈에서 영감을 받아tar 명령에서 특정 옵션 순서가 중요한 이유는 무엇입니까?, 질문자가 왜 작동하지 않는지 알게 되면 tar -cfv test.tar *.jpg후속 질문을 하고 싶습니다. 진지하게, 왜 안되겠습니까?

명령에 -f매개변수가 필요한 옵션과 -v매개변수가 필요하지 않은 옵션이 있는 경우 다음과 같습니다.

cmd -fv foo

두 가지 다른 방식으로 해석될 수 있습니다. v옵션에 대한 인수 -f이고 foo옵션이 아닌 인수이거나 foo옵션에 대한 인수이고 -f옵션 -v이 존재합니다. 첫 번째 설명은 POSIX가 getopt()하는 일이므로 이렇게 실행되는 명령이 많이 있습니다.

나는 항상 두 번째 설명을 선호합니다. foo인수 를 받는지 여부에 관계없이 모든 옵션을 함께 포장 하는 -f것이 . 하지만 이런 행동은 더 이상 거의 존재하지 않습니다. 최근에 내가 사용한 유일한 명령은 Java 명령입니다 (해당 구문은 분명히 Sun 버전에서 영감을 받았습니다 ).-f foo-ffoojartartar cfv tarfile ...

Xlib에는 "개별" 인수 또는 "고정" 인수를 사용하여 옵션을 지정할 수 있는 getopt유사한 기능이 있습니다. 하지만 긴 옵션( , 등) XrmParseCommand을 처리하므로 또는 와 관련 없는 다른 옵션 으로 처리됩니다 . 따라서 이것은 나의 두 번째 해석의 예가 아닙니다.-display-geometry-fv-f-v

압축 매개변수가 언제 그리고 왜 지배적이 되었습니까? 이 문제는 POSIX 이전에 해결되었습니까? 아니면 POSIX 인증으로 이 문제가 확인되었습니까? POSIX의 첫 번째 버전은 현재 버전과 동일한 특정 요구 사항을 갖습니까? 고대에 이 주제에 관해 기록된 토론이 있습니까?

= 스타일 옵션 구문 분석을 지원하거나 역사적으로 지원되는 다른 명령( tar및 외에)이 있습니까 ?jar-fv foo-f foo -v

답변1

첫째, 표준 getopt()스타일 인수 처리에서 인수는 적용되는 옵션에 따라 압축될 필요가 없으며 압축할 수 있습니다. 따라서 -f매개변수가 승인되면 다음 두 가지가 모두 유효합니다.

command -ffoo positional arguments
command -f foo positional arguments

당신이 "두 번째 설명"이라고 부르는 것은 실제로 매우 드뭅니다. 내가 지금 생각할 수 있는 한, tarmt방식으로 작동하는 유일한 기존 명령입니다... 그리고 말씀하신 것처럼 , 하지만 이는 이 명령이 매개변수를 처리하는 방식이 표준 과 동일하지 않기 jar때문입니다 . 스타일이 많이 달라요. 옵션이 앞에도 표시되지 않습니다 ! 왜 거의 사용되지 않는지 확실히 말할 수는 없지만 어떤 옵션이 어떤 인수와 일치하는지 알기 어렵기 때문인 것 같습니다. 예를 들어, 와 인수를 취하지만 , , 그리고 그렇지 않은 경우 다음과 같은 결과가 나타납니다.targetopt()-bdace

command abcde b-argument d-argument

...이는 명령을 작성할 때 옵션 문자 그룹을 다시 살펴보고, 다시 읽고, 인수가 필요한 옵션을 기억하고, 인수를 동일한 순서로 작성해야 함을 의미합니다. 이건 어때?

command adcbe b-argument d-argument

이런, 이 d옵션은 b-argument반대가 되었습니다. 더 나쁜 것은 다음과 같습니다.

command lmnop foo bar baz

...명령에 익숙하지 않고 어떤 매개변수가 어떤 옵션과 함께 사용되는지 알 수 없습니다. foo, bar, 및 는 , , (및 인수를 취하지 않음)에 대한 인수일 수 있습니다. baz또는 및 는 위치 인수... 또는 기타 가능한 조합과 함께 있을 수 있습니다.noplmfoobarmpbaz

관련 정보