최근 이슈에서 영감을 받아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
-ffoo
jar
tar
tar 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
당신이 "두 번째 설명"이라고 부르는 것은 실제로 매우 드뭅니다. 내가 지금 생각할 수 있는 한, tar
이 mt
방식으로 작동하는 유일한 기존 명령입니다... 그리고 말씀하신 것처럼 , 하지만 이는 이 명령이 매개변수를 처리하는 방식이 표준 과 동일하지 않기 jar
때문입니다 . 스타일이 많이 달라요. 옵션이 앞에도 표시되지 않습니다 ! 왜 거의 사용되지 않는지 확실히 말할 수는 없지만 어떤 옵션이 어떤 인수와 일치하는지 알기 어렵기 때문인 것 같습니다. 예를 들어, 와 인수를 취하지만 , , 그리고 그렇지 않은 경우 다음과 같은 결과가 나타납니다.tar
getopt()
-
b
d
a
c
e
command abcde b-argument d-argument
...이는 명령을 작성할 때 옵션 문자 그룹을 다시 살펴보고, 다시 읽고, 인수가 필요한 옵션을 기억하고, 인수를 동일한 순서로 작성해야 함을 의미합니다. 이건 어때?
command adcbe b-argument d-argument
이런, 이 d
옵션은 b-argument
반대가 되었습니다. 더 나쁜 것은 다음과 같습니다.
command lmnop foo bar baz
...명령에 익숙하지 않고 어떤 매개변수가 어떤 옵션과 함께 사용되는지 알 수 없습니다. foo
, bar
, 및 는 , , (및 인수를 취하지 않음)에 대한 인수일 수 있습니다. baz
또는 및 는 위치 인수... 또는 기타 가능한 조합과 함께 있을 수 있습니다.n
o
p
l
m
foo
bar
m
p
baz