나는 일부 심볼릭 링크를 관리하는 데 도움이 되는 Bash 스크립트를 작성했습니다. 그것은 일부를위한 포장지입니다집어 챙겨 넣다주문하다.
호출할 때 명령( plug
// ) unplug
과 replug
디렉터리 이름(경로가 아닌 기본 이름만)이라는 두 개의 명령줄 인수를 전달합니다.
스크립트가 호출되므로 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
첫 번째 인수의 경우 제공된 단어 목록에서 일치하는 단어를 생성하고- 두 번째 인수의 경우 관련 디렉터리에서 일치하는 디렉터리 이름이 생성됩니다.