나는 종종 다른 명령을 래핑하도록 설계된 쉘 함수나 쉘 스크립트를 작성하고 있습니다.
나는 또한 그러한 래퍼가 일부 플래그/옵션을 지원했으면 하는 경우가 종종 있습니다. 개념은 래퍼가 명령줄 인수에서 지원하는 모든 플래그/옵션(해당되는 경우 해당 인수)을 제거하고 나머지 인수를 래핑된 명령에 대한 인수로 전달해야 한다는 것입니다.
이제 래퍼 명령은 종종 자체 플래그와 옵션도 지원합니다. 이는 위의 시나리오에 따라 래퍼가 자체 플래그/옵션은 물론 래핑된 명령이 지원하는 플래그/옵션을 포함하여 명령줄 인수를 처리할 수 있어야 함을 의미합니다.
이러한 래퍼를 구현하는 한 가지 방법은 GNU를 호출할 때 래핑 명령에 대한 래퍼와 옵션을 지정한 getopt
다음 일부 배열에서 후자와 옵션이 아닌 인수를 모두 수집하는 것입니다 WRAPPED_COMMAND_ARGUMENTS
. 그런 다음 나중에 래핑된 명령이 "${WRAPPED_COMMAND_ARGUMENTS[@]}"
해당 명령줄 인수와 함께 호출됩니다.
이 접근 방식은 나에게 적합하지만 래핑된 명령에 옵션이 많으면 매우 힘들 수 있습니다.
대신에 나는 이 기사의 제목에서 "GNU에 대한 관용적 대안"이라고 부르는 것을 찾고 싶습니다 getopt
. 나는 명시적으로 지정한 옵션을 구문 분석하는 데 도움이 되는 도구를 언급하고 있으며 getopt
, 나머지 모든 인수를 동일하게 처리합니다. 즉, 선행 하이픈의 유무에 따라 구별하지 않습니다.
그런 게 있나요?
답변1
이러한 작업에 대한 일반적인 접근 방식은 --
래퍼 스크립트에 의해 처리된 옵션과 래퍼가 실행 중인 프로그램에 그대로 전달된 옵션 사이의 구분 기호 역할을 하는 것입니다.
./my-wrapper -a -b -c -- -d -e -f
--
options 의 끝을 표시합니다 my-wrapper
. 다른 모든 인수와 그에 따른 모든 옵션은 --
래핑하는 프로그램에 전달될 수 있으며 래퍼 스크립트는 이를 전혀 처리할 필요가 없습니다.
또한 옵션의 충돌하는 사용을 허용합니다. 예를 들어 grep
, 다른 많은 프로그램에서는 -i
검색 시 대소문자를 구분하지 않아야 한다는 의미를 사용하는 반면 -i
래퍼 스크립트에서 입력 파일을 지정하는 데 사용할 수 있습니다. 를 사용하면 --
충돌이 없습니다. 이전에는 "입력 파일"을 의미 -i
하고 이후에는 "대소문자 구분 안 함"을 의미합니다.--
-i
--
또한 주목할 만한 점은 래핑된 프로그램이 --
종료되는 것으로 해석될 수도 있다는 것입니다.그것은options 및 --
파일 이름이나 문자열 또는 기타 옵션이 아닌 인수 뒤의 모든 항목(예: options로 시작하는 파일 이름이 -
옵션으로 처리되는 것을 방지).
./my-wrapper -a -b -c -- -d -e -f -- non-option args here
그건 그렇고, --
적어도 1970년대 후반이나 1980년대 초반부터 옵션의 끝을 표시하는 데 사용되었습니다.