디렉터리 로컬 실행 파일에 Bash 완성을 제공하는 방법은 무엇입니까?

디렉터리 로컬 실행 파일에 Bash 완성을 제공하는 방법은 무엇입니까?

나는 일부 심볼릭 링크를 관리하는 데 도움이 되는 Bash 스크립트를 작성했습니다. 그것은 일부를위한 포장지입니다집어 챙겨 넣다주문하다.

호출할 때 명령( plug// ) unplugreplug디렉터리 이름(경로가 아닌 기본 이름만)이라는 두 개의 명령줄 인수를 전달합니다.

스크립트가 호출되므로 vlink호출은 다음과 같습니다.

vlink plug foo

디렉터리 이름( foo위 예에서)은 내 시스템에 있는 특정 디렉터리의 하위 디렉터리 중 하나여야 합니다.

plug세 번째 인수에는 세 개의 가능한 명령( / unplug/ )과 가능한 특정 디렉터리 이름 세트 만 있으므로 replug일부 탭 완성 기능을 제공하고 싶습니다.

저는 Bash 완성 스크립트 작성에 어느 정도 익숙합니다. 하지만 내 $PATH에 없고 상위 디렉토리에서만 실행되도록 의도된 실행 파일에 대한 완성 명령을 제공하는 방법이 있습니까?

답변1

이것은 효과가 있을 수 있습니다:

_vlink () {
    case $COMP_CWORD in
        1) COMPREPLY=( $(compgen -W "plug unplug replug" "$2") ) ;;
        2) local IFS=$'\n'
            COMPREPLY=( $(cd /some/dir && compgen -d "$2") ) ;;
    esac
}

complete -F _vlink vlink

/some/dir관심 있는 하위 디렉터리가 포함된 디렉터리로 바꿉니다 . (디렉토리 이름에 개행 문자가 없다고 가정합니다.)

  • COMP_CWORD완성되는 단어의 인덱스입니다(0은 명령 이름).
  • 완성 함수의 두 번째 인수는 완성되는 단어입니다(첫 번째는 명령 이름, 세 번째는 이전 단어).

그래서 우리는 다음을 사용합니다 compgen:

  • -W첫 번째 인수의 경우 제공된 단어 목록에서 일치하는 단어를 생성하고
  • 두 번째 인수의 경우 관련 디렉터리에서 일치하는 디렉터리 이름이 생성됩니다.

관련 정보