Bash: 자동 완성을 사용할 때 변수 이름 대체를 피하는 방법은 무엇입니까?

Bash: 자동 완성을 사용할 때 변수 이름 대체를 피하는 방법은 무엇입니까?

Bash가 경로에서 변수 이름 제거를 중단하고 해당 값으로 바꾸길 원합니다. 경로 자동 완성을 적용한 후 변수를 대체하지 않은 상태로 유지하는 데 성공하지 못한 채 다양한 bash 버전에서 여러 "shopts" 설정을 시도했습니다. $APPSERVER를 입력하고 Tab 키를 누른 후 다음 결과를 원합니다.

$APPSERVER/foo/bar

바꾸다

/terribly-long-path-to-desired-appserver-instance/foo/bar

후자는 사실 이후에 스크립트를 추출하는 것을 번거롭게 만듭니다. BASH를 자동 완성으로 설정하고 변수 이름을 유지하는 방법을 아는 사람이 있습니까?

답변1

이것이 당신이 원하는 것입니다최대피복재.

:

$ at_path $HOME D<tab><tab>
Desktop/    Documents/  Downloads/  Dropbox/ 
$ at_path $HOME Doc<tab>
$ at_path $HOME Documents/<tab><tab>
Documents/projects/   Documents/scripts/  Documents/utils/      
Documents/clients/
$ at_path $HOME Documents/cli<tab>
$ at_path $HOME Documents/clients/<enter>
/home/bill-murray/Documents/clients/

파일을 복사해서 가져와서 작동시키세요

#
#  The function to provide the "utility": stitch together two paths
#
at_path () {
  printf "${1}/${2}"
}


#
# The completion function
#
_at_path () {

    # no pollution
    local base_path
    local just_path
    local full_path
    local and_path=${COMP_WORDS[2]}

    # global becasue that's how this works
    COMPREPLY=()

    if [[ ${COMP_WORDS[1]} =~ \$* ]]; then
        base_path=`eval printf "${COMP_WORDS[1]}"`
        full_path=${base_path}/${and_path}
        just_path=${full_path%/*}
        COMPREPLY=( $(find ${just_path} -maxdepth 1 -path "${base_path}/${and_path}*" -printf "%Y %p\n" |\
                      sed -e "s!${base_path}/!!" -e '/d /{s#$#/#}' -e 's/^. //' 2> /dev/null) )
    else
        COMPREPLY=()
    fi

}

#
# and tell bash to complete it
#
complete -o nospace -F _at_path at_path

이 답변은 상당히 토끼굴처럼 진행되며 다른 사람들의 솔루션을 계속 주시하겠습니다! 행운을 빌어요!

관련 정보