명령의 매개변수를 자동으로 구문 분석하는 것이 가능합니까?

명령의 매개변수를 자동으로 구문 분석하는 것이 가능합니까?

git clone다음을 수행하는 래퍼를 생성하여 명령을 수정하여 로컬 캐시를 사용하고 싶습니다 .

  1. 저장소가 캐시에 없으면 복제합니다.
  2. 원하는 위치에 복사하세요.

그런데 어떻게 파싱하나요?git clonerepository값을 얻기 위한 명령줄 인수는 사소한 것 같지만 좋은 해결책을 찾을 수 없습니다.

이는 명령줄 인수의 구조가 부족하기 때문인 것 같습니다. 일부는 스위치일 수도 있고 일부는 값 등이 뒤따를 수도 있습니다. git이 경우 선택적 인수 <repository>가 뒤에 올 수 있으므로 <directory>항상 마지막 인수를 전달할 수는 없습니다. CLI 매개변수가 사전 등과 같이 좀 더 구조화될 수 있다면 좋을 것입니다.

repository다음과 같은 도구를 사용하여 자동으로 매개 변수를 가져올 수 있도록 문서에 지정된 구문을 지정하는 방법이 있습니까 getopts?

git참고: 저는 명령을 사용하여 저장소를 자동으로 다운로드하기 위해 Jenkins, Buildout 등 여러 도구를 사용하므로 git래퍼가 가장 좋은 솔루션이라고 생각합니다.

git로컬 Git 서버, URL 재작성 등과 같이 시도해 볼 만한 특정 솔루션 도 있습니다 .

답변1

명령의 인수를 반복하여 명령 내에서 저장소를 검색 @하거나 https://찾은 다음 URL을 구문 분석하여 필요한 것을 추출할 수 있습니다.

예를 들어 Python에서는 다음과 같습니다.


import sys

if len(sys.argv) > 1:
    for i in sys.argv:
        # Do whatever you want (parsing the URL...)

답변2

나는 해킹된 스크립트를 생각해 냈습니다. /usr/local/bin/git그것은 Nicholas가 언급한 아이디어를 사용합니다. 최신 버전의 Git에서 제공되는 및 기능을 사용합니다 --reference-if-able.--dissociate

#!/usr/bin/env bash

# The real executable is located at /usr/local/bin/tig.

command=$1

cache=$HOME/.cache/git/repositories

if [[ ! $command == "clone" ]]; then
    /usr/local/bin/tig "$@"
    exit
fi

caching=false

for argument in "${@:2}"; do
    case $argument in
        --reference | --reference-if-able)
            caching=false
            break
            ;;
        *[email protected]:*)
            caching=true
            [[ $argument == *.git ]] && argument=${argument%.git}
            folder=$cache/$argument
            ;;
    esac
done

if $caching; then
    echo "INFO: Using cache: $folder"
    /usr/local/bin/tig clone \
        --reference-if-able "$folder" --dissociate "${@:2}"
else
    /usr/local/bin/tig "$@"
fi

면책조항: 이는 개발 용도로만 사용됩니다. 가장 좋은 방법은 Stephen이 제안한 것처럼 Goblet과 같은 Git 프록시 서버를 사용하는 것입니다.

관련 정보