Bash 완성 스 크 립 트 작성

다음으로 전송: 둥 근 둥지 , 본문 고정 링크: Bash 완성 스 크 립 트 작성
리 눅 스에 게 자동 완성 은 더 이상 익숙 할 수 없 는 기능 이다.명령 행 에서 다음 부분의 명령 을 두 드 렸 을 때, 본능적으로 Tab 키 를 눌 러 완전한 명령 을 보완 할 것 입 니 다. 물론 명령 보완 외 에 도 파일 이름 보완 도 있 습 니 다.
Bash-completion
이 기능 을 자동 으로 보완 하 는 것 은 Bash 자체 가 가지 고 있 지만, 일반적으로 우 리 는 bash - completion 패 키 지 를 설치 하여 더 좋 은 보완 효 과 를 얻 을 수 있 습 니 다. 이 패 키 지 는 기 존의 명령 보완 스 크 립 트 를 제공 합 니 다. 일부 기본 적 인 함수 들 은 스 크 립 트 를 작성 하 는 데 편리 하고 기본 적 인 설정 스 크 립 트 도 있 습 니 다.하지만 앞서 말 했 듯 이 이 가방 은 꼭 필요 한 것 이 아니 라 힘 을 절약 할 수 있 을 뿐이다.
bash - completion 이 가방 의 설치 위 치 는 발행 판 에 따라 다 르 지만 대체적으로 사용 하 는 원 리 는 비슷 합 니 다. 보통 bash 라 는 이름 이 있 습 니 다.completion 스 크 립 트 입 니 다. 이 스 크 립 트 는 셸 이 초기 화 될 때 불 러 옵 니 다.예 를 들 어 RHEL 시스템 에 있어 서 이 스 크 립 트 는/etc/bash 에 있 습 니 다.completion, 이 스 크 립 트 는/etc/profile. d/bashcompletion. sh 에서 가 져 오기:
# Check for interactive bash and that we haven't already been sourced.[ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION" ] && return# Check for recent enough version of bash.bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}if [ $bmajor -gt 3 ] || [ $bmajor -eq 3 -a $bminor -ge 2 ]; then
    if shopt -q progcomp && [ -r /etc/bash_completion ]; then
        # Source completion code.
        . /etc/bash_completion    fifiunset bash bmajor bminor

그리고 bashcompletion 스 크 립 트 에/etc/bash 를 불 러 옵 니 다.completion. d 아래 완성 스 크 립 트:
if [[ $BASH_COMPLETION_DIR != $BASH_COMPLETION_COMPAT_DIR && \    -d $BASH_COMPLETION_DIR && -r $BASH_COMPLETION_DIR && \    -x $BASH_COMPLETION_DIR ]]; then
    for i in $(LC_ALL=C command ls "$BASH_COMPLETION_DIR"); do
        i=$BASH_COMPLETION_DIR/$i        [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)|Makefile*) \
            && -f $i && -r $i ]] && . "$i"
    donefiunset i

스 크 립 트 의 이름 은 보통 명령 이름 입 니 다. 쉽게 찾 을 수 있 습 니 다.
$ ls i*iconv  iftop  ifupdown  info  iproute2  iptables

내장 보완 명령
Bash 에는 두 개의 보전 명령 이 내장 되 어 있 는데 각각 compgencomplete 이다.compgen 명령 은 서로 다른 매개 변수 에 따라 단어 와 일치 하 는 후보 완성 목록 을 생 성 합 니 다. 예 를 들 어:
$ compgen -W 'hi hello how world' h
hi
hello
how
compgen 가장 많이 사용 되 는 옵션 은 - W 입 니 다. - W 매개 변 수 를 통 해 빈 칸 으로 구 분 된 단어 목록 을 지정 합 니 다.h. 명령 행 에 현재 입력 한 단 어 를 실행 한 후에 후보 와 일치 하 는 목록 을 출력 합 니 다. 여 기 는 h 로 시작 하 는 모든 단어 입 니 다.complete 명령 의 매개 변 수 는 약간 유사 합 니 다 compgen. 그러나 명령 을 어떻게 보완 하 는 지 설명 하 는 역할 을 합 니 다. 예 를 들 어 - W 매개 변 수 를 사용 하여 후 보 를 지정 하 는 단어 목록 입 니 다.
$ complete -W 'word1 word2 word3 hello' foo
$ foo w$ foo wordword1  word2  word3

우 리 는 - F 매개 변 수 를 통 해 보완 함 수 를 지정 할 수 있 습 니 다.
$ complete -F _foo foo

현재 foo 명령 을 입력 하면 호출foo 함수 로 보 완 된 목록 을 만 들 고 보 완 된 기능 을 완성 하 는 것 이 바로 스 크 립 트 를 보완 하 는 관건 입 니 다. 뒤에서 소개 하 겠 습 니 다.
관련 내 장 된 변 수 를 보완 합 니 다.
위의 두 개의 보완 명령 을 제외 하고 Bash 는 몇 개의 내 장 된 변 수 를 보조 적 으로 보완 하 는 기능 을 가지 고 있 습 니 다. 여기 서 주로 세 가 지 를 소개 합 니 다.
  • COMP_WORDS: 유형 은 배열 로 현재 명령 행 에 입력 한 모든 단 어 를 저장 합 니 다.
  • COMP_CWORD: 종 류 는 정수 이 고 현재 커서 에 입력 한 단 어 는 COMP 에 있 습 니 다.WORDS 배열 의 색인;
  • COMPREPLY: 유형 은 배열 이 고 후보의 보전 결과 이다.
  • COMP_WORDBREAKS: 형식 은 문자열 로 단어 간 의 구분자 임 을 나타 낸다.
  • COMP_LINE: 형식 은 문자열 로 현재 명령 행 의 입력 을 표시 합 니 다.

  • 예 를 들 어 우 리 는 이러한 보전 함 수 를 정의 합 니 다foo:
    $ function _foo()> {>     echo -e "
    "> >     declare -p COMP_WORDS>     declare -p COMP_CWORD>     declare -p COMP_LINE>     declare -p COMP_WORDBREAKS> }$ complete -F _foo foo

    만약 에 우리 가 명령 행 아래 에 다음 내용 을 입력 하고 Tab 키 를 누 르 면 완성 합 니 다.
    $ foo b
    
    declare -a COMP_WORDS='([0]="foo" [1]="b")'declare -- COMP_CWORD="1"declare -- COMP_LINE="foo b"declare -- COMP_WORDBREAKS=" 	
    \"'><=;|&(:"

    위의 결과 에 대해 나 는 이 몇 개의 변 수 를 비교적 쉽게 이해 할 수 있 을 것 이 라 고 생각한다.물론 우리 가 전에 말 했 듯 이 Bash - completion 가방 은 필수 적 인 것 이 아니 라 보완 기능 은 Bash 자체 가 가지 고 있 는 것 이 라 고 합 니 다.
    스 크 립 트 를 작성 하 다
    완성 스 크 립 트 는 두 부분 으로 나 뉘 어 있 습 니 다. 완성 함수 와 사용 complete 명령 을 작성 하여 완성 함 수 를 사용 합 니 다.후자 의 난이 도 는 거의 무시 하고 보완 함 수 를 어떻게 쓰 느 냐 에 중점 을 두 고 있다.어 려 운 점 은 인터넷 에서 이와 관련 된 문서 가 매우 적은 것 같 지만 사실은 Bash - completion 이 자체 적 으로 가지 고 있 는 보완 스 크 립 트 가 가장 좋 은 출발점 이 므 로 몇 가지 간단 한 수정 을 고 르 면 대체적으로 사용 할 수 있다.
    일반 완성 함수 (여기 가 여전히 foo 라 고 가정) 는 다음 과 같은 두 변 수 를 정의 합 니 다.
    local cur prev

    그 중에서 cur 는 현재 커서 아래 의 단 어 를 표시 하고 prev 는 이전 단어 에 대응 합 니 다.
    cur="${COMP_WORDS[COMP_CWORD]}"prev="${COMP_WORDS[COMP_CWORD-1]}"

    해당 변 수 를 초기 화 한 후, 우 리 는 보완 행 위 를 정의 해 야 합 니 다. 즉, 무엇 을 입력 한 상태 에서 어떤 내용 을 보완 하 는 지, 예 를 들 어 입력 - 시작 옵션 을 입력 할 때, 우 리 는 모든 옵션 을 후보 로 하 는 보완 결과 입 니 다.
    local opts="-h --help -f --file -o --output"if [[ ${cur} == -* ]] ; then
            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
            return 0fi

    그러나 COMPREPLY 에 값 을 부여 하기 전에 다른 완성 함수 에 의 해 방 해 받 지 않도록 초기 화 하 는 것 이 좋 습 니 다.
    현재 완전한 완성 함 수 는 다음 과 같 습 니 다:
    function _foo() {
        local cur prev opts
    
        COMPREPLY=()
    
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        opts="-h --help -f --file -o --output"
    
        if [[ ${cur} == -* ]] ; then
            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
            return 0
        fi}

    현재 명령 줄 아래 에서 foo 명령 에 대한 매개 변 수 를 보완 할 수 있 습 니 다:
    $ complete -F _foo foo
    $ foo --f        --file    -h        --help    -o        --output

    물론, 우리 가 있 는 이곳 의 예 는 prev 변 수 를 사용 하지 않 은 것 같다.prev 변 수 를 잘 사용 하면 보완 결 과 를 더욱 완전 하 게 할 수 있 습 니 다. 예 를 들 어 -- file 을 입력 한 후에 우 리 는 특수 한 파일 을 보완 하고 싶 습 니 다 (. sh 로 끝 나 는 파일 을 가정 합 니 다).
        case "${prev}" in
            -f|--file)
                COMPREPLY=( $(compgen -o filenames -W "`ls *.sh`" -- ${cur}) )
                ;;
        esac

    이제 foo 명령 을 실행 하면 -- file 매개 변수의 값 도 보완 할 수 있 습 니 다.
    $ foo --filea.sh b.sh c.sh

    완성 스 크 립 트 설치
    Bash - completion 패키지 가 설치 되 어 있 으 면, 완성 스 크 립 트 를/etc/bash 에 놓 을 수 있 습 니 다.completion. d 디 렉 터 리 아래 에 두 거나 ~/. bashcompletion 파일 중.Bash - completion 패키지 가 설치 되 어 있 지 않 으 면 ~/. bashrc 또는 셸 에 불 러 올 수 있 는 초기 화 파일 에 스 크 립 트 를 추가 할 수 있 습 니 다.
    참조 링크
  • An introduction to bash completion: part 2
  • Writing your own Bash Completion Function
  • Programmable Completion
  • Completion Files
  • 좋은 웹페이지 즐겨찾기