배쉬 자동완성

배쉬 자동완성

자동완성이 어떻게 작동하는지 알아보려고 합니다. 나는 읽었다이것complete그리고 compgen, , 및 에 대한 전체 bash 참조가 있지만 compopt실제로 어떻게 함께 작동하는지에 대해서는 많은 것을 알려주지 않습니다.

(상당히 작은 컬렉션의) 동사 뒤에 기존 파일 이름을 사용하는 명령에 대한 자동 완성을 만들려고 합니다. 지금까지 나는 이것을 가지고 있습니다 :

verbs=(upload download delete)

function ac_complete {
    printf "COMP_WORDS[%d/%d]: "  ${COMP_CWORD} ${#COMP_WORDS[@]}
    printf "[%s] " "${COMP_WORDS[@]}"
    printf "\n"
    
    if [[ COMP_CWORD -eq 1 ]] 
    then 
        COMPREPLY=( "${verbs[@]}" )
    else
        compopt -o default
    fi
}

complete -F ac_complete testit

하지만 이것은 작동하지 않습니다. 저는 bash가 동사를 완성하는 것을 본 적이 없습니다.

  • 가능한 완료를 반환하는 방법은 무엇입니까?
  • 무엇을 반환해야 합니까? 그 당시 여전히 유효한 항목만(즉, "d" 이후 설정은 "업로드"/"다운로드"/"삭제" 또는 그냥 "다운로드"/"삭제"여야 합니다(그렇다면 빠른 방법이 있습니까?) 제한이 적용될 수 있나요?

파일 완성은 작동하지만 몇 가지 파일 형식으로 제한하고 싶습니다...

답변1

저것 좀 봐(이거bash_complete패키지를 예로 들어보겠습니다.

완성을 생성하는 가장 일반적인 방법은 compgen빌드 COMPREPLY배열을 호출하는 것입니다. 이 특정 컨텍스트에서 어떤 매개변수가 유효한지 확인한 다음 compgen호출을 변환하십시오. 내장 필터 매개변수는 compgen지정된 접두사에 대한 완성이 아닙니다. 예를 들어:

COMPREPLY=( $(compgen -W "${verbs[*]}" -- "${COMP_WORDS[COMP_CWORD]}") )

compgen완료하기 위해 계산된 단계이며 d유효 download합니다 delete.

파일의 경우 compgen -G "*.ext"확장자로 제한을 사용하세요 .ext. 이 간단한 관용구는 공백(또는 와일드카드)으로 인해 파일 이름을 손상시킵니다. 이것_filedir기능은 다음에서 비롯됩니다.bash_completion보다 강력한 방식으로 파일 이름을 처리합니다(개행 및 와일드카드는 여전히 중단됨) _filedir '*.ext'.

관련 정보