git 명령을 재정의한 후 git 자동 완성 기능이 중단됩니다.

git 명령을 재정의한 후 git 자동 완성 기능이 중단됩니다.

최근에 git branch <tab>다음 오류가 표시되기 시작했습니다.

$ git branch bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `/usr/bin/git --git-dir=.git for-each-ref --format=%(refname:short) refs/tags refs/heads refs/remotes'
HEAD bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `/usr/bin/git --git-dir=.git for-each-ref --format=%(refname:short) refs/tags refs/heads refs/remotes'
HEAD ^C

어떻게 해결할 수 있나요?

나는 다음과 같은 줄을 가지고 있습니다 ~/.bashrc:

git() {
    cmd=$1
    shift
    extra=""

    quoted_args=""
    whitespace="[[:space:]]"
    for i in "$@"
    do
        if [[ $i =~ $whitespace ]]
        then
            i=\"$i\"
        fi
        quoted_args="$quoted_args $i"
    done

    cmdToRun="`which git` "$cmd" $quoted_args"
    cmdToRun=`echo $cmdToRun | sed -e 's/^ *//' -e 's/ *$//'`
    bash -c "$cmdToRun"
    # Some mad science here
}

답변1

귀하의 스크립트는 따옴표를 유지하지 않습니다. 완료 후 실행되는 원래 줄은 다음과 같습니다.

git --git-dir=.git for-each-ref '--format=%(refname:short)' refs/tags refs/heads refs/remotes

스크립트를 사용하면 다음을 얻을 수 있습니다.

bash -c '/usr/bin/git --git-dir=.git for-each-ref --format=%(refname:short) refs/tags refs/heads refs/remotes'

다음과 같이 누락된 따옴표를 참고하세요.

--format=%(refname:short)

실제로 무엇을 하는지는 본 적이 없지만 다음과 같습니다.

quoted_args="$quoted_args \"$i\""
#                         |  |
#                         +--+------- Extra quotes.

그러면 다음과 같은 결과가 생성됩니다.

bash -c '/usr/bin/git --git-dir=.git "for-each-ref" "--format=%(refname:short)" "refs/tags" "refs/heads" "refs/remotes"'

또는:

quoted_args="$quoted_args '$i'"
#                         |  |
#                         +--+------- Extra quotes.

bash -c '/usr/bin/git --git-dir=.git '\''for-each-ref'\'' '\''--format=%(refname:short)'\'' '\''refs/tags'\'' '\''refs/heads'\'' '\''refs/remotes'\'''

%q형식을 확인하고 싶을 수도 있습니다 printf.

관련 정보