명령줄 도구에서 상호 배타적인 옵션을 사용해야 합니까?

명령줄 도구에서 상호 배타적인 옵션을 사용해야 합니까?

CLI 도구를 작성하면서 어려운 문제에 직면했습니다.

이 도구는 이미지에서 얼굴을 감지하고 자동으로 흐리게 처리합니다. 그러나 때로는 외부 도구를 사용하여 다른 얼굴을 수동으로 표시하기 위해 이러한 작업 중 하나만 수행해야 하는 경우도 있습니다. 그래서 저는 세 가지 행동을 지원하고 싶습니다:

  1. 한 번에 얼굴을 감지하고 흐리게 처리
  2. 얼굴만 감지
  3. 얼굴만 흐리게 해라

이 문제를 해결하기 위한 내 생각은 --only-detect및 와 같은 상호 배타적인 두 가지 옵션입니다 --only-blur.

그러나 동료는 --detect사용하는 것이 더 합리적일 수 있으므로 --blur두 옵션을 모두 사용하면 그렇지 않은 경우와 동일한 동작이 발생한다고 제안했지만 이것이 덜 직관적이라고 생각합니다.

지금 내 질문은 다음과 같습니다.이 결정을 내리기 위해 따를 수 있는 규칙이 있습니까?찾았어요POSIX 유틸리티 규칙, 상호 배타적인 그룹을 언급하지만 여기서는 도움이 되지 않습니다.

답변1

POSIX는 다음과 같이 말합니다(POSIX 유틸리티의 상호 배타적인 명령줄 옵션과 관련하여):

충돌하는 상호 배타적 매개변수를 사용하면 유틸리티 설명에서 달리 지정하지 않는 한 정의되지 않은 결과가 생성됩니다.


일부 명령줄 도구에는 충돌하는 명령줄 옵션(예: --silent옵션과 --verbose옵션 모두)이 있습니다. 도구를 호출할 때 두 옵션을 모두 사용하는 경우 허용되는 경우 일반적으로 마지막으로 구문 분석된 옵션(줄의 마지막 옵션)이 승리합니다.

합계의 마지막 금액 이 사용됩니다 --blur. --detect문서에는 어떤 옵션이 배타적인지 명시되어 있습니다.

예를 들어, ls -l -C다음과 비교하십시오.ls -C -l


다른 도구는 단순히 충돌하는 명령줄 옵션을 억제하고, 표준 오류 스트림에서 사용자에게 진단 메시지를 제공하며, 이 문제가 발생하면 0이 아닌 종료 코드로 종료됩니다.

및 을 둘 다 사용하면 --blur코드가 손상됩니다.--detect

이는 예를 들어 cut충돌 플래그 및 를 사용 하여 수행 됩니다 -b.-c-f


일부 도구는 호출되는 이름에 따라 다른 효과를 제공할 수 있습니다. 따라서 도구에는 두 개의 이름(하드 링크)이 있을 수 있습니다. 하나는 이름이 지정 detectface되고 다른 하나는 으로 명명 blurface됩니다. 이들은 정확히 동일한 바이너리이지만 프로그램은 수행할 작업을 결정하기 위해 호출되는 이름을 결정합니다.

이는 일부 쉘이 /bin/sh(POSIX 쉘) 및 그 자체(예 bash: Linux 또는 kshOpenBSD)인 척하고 sh호출될 때 "POSIX 모드"로 전환하는 시스템에서 흔히 발생합니다 sh. 또는 C 및 C++ 코드를 모두 컴파일하는 컴파일러가 있을 수 있습니다 . cc또는 등 으로 불리는지에 따라 c++모드를 전환합니다 . ( gcc둘 다 clang이 작업을 수행합니다)

답변2

나는 대부분의 경우 사용자가 프로그램이 무엇을 하기를 원하는지 스스로에게 물어보고 이를 기본 동작으로 만들 것입니다. 이 기본 동작은 옵션이 지정되지 않은 경우 자동으로 트리거되어야 합니다. 반면에만약에지정된 옵션이 있는데,아무것도 없다옵션을 지정하지 않는 한 명령을 통해 이 작업을 수행해야 합니다.


이것이 제가 생각하는 반례입니다극심한 빈곤프로그램 작성:

avconv -i file.avi

비디오 파일에 대한 정보를 일부 출력하고, -i입력 파일을 설정하며, 출력이 지정되지 않았으므로 avconv해당 정보만 필요합니다.

avconv file.avi

avconv매개변수가 의도적으로 출력 파일로 사용되어 기록되므로 경고 없이 소중한 비디오를 덮어쓰거나 백업을 만드십시오.~에 관계없이, 쓸 내용이 없더라도.

내 생각 엔 당신이 맞다.


이것이 바로 내가 직관이라고 부르는 것입니다. 기본 동작이 다음과 같은 경우

  • 감지 및 흐림:
    • command감지 하고
      command --detect --blur흐리게 처리합니다.
    • command --detect감지만 가능
    • command --blur흐릿해질 뿐이야
  • 예를 들어 탐지를 위해 단 하나:
    • command그리고
      command --detect단지 감지
    • command --blur흐릿해질 뿐이야
    • command --detect --blur감지하고 흐리게 처리합니다. 이것이 유용하다고 생각되면 command --detectblur약칭 도 있습니다.

또한 기본 동작에 관계없이 사용자가 두 옵션을 모두 설정하기 위해 호출할 수 -d있는 짧은 옵션도 정의했습니다 .-bcommand -bd

관련 정보