알 수 없는 명령 이름에 대한 Bash 완료(공개 접두사 포함)

알 수 없는 명령 이름에 대한 Bash 완료(공개 접두사 포함)

현재 상황은 바이너리가 모두 동일한 접두사로 시작하는 일련의 애플리케이션에 대해 bash 완성을 설정해야 한다는 것입니다. 이를 호출해 보겠습니다 blargh. 나는 이 완성기를 사용하는 사람이 자신의 컴퓨터에 어떤 응용 프로그램을 갖게 될지 모르고 아마도 알 수 없습니다 blargh*(비록 내 경우에는 접두사가 다른 명령의 정상적인 작동을 방해하지 않을 만큼 고유하지만).

즉, 다음과 같은 작업을 수행하고 싶습니다.

complete -F _function_name "blargh*" "./blargh*"

이제 내가 얻는 것은 매우 일반적인 완료 프로그램입니다.

# blargh-completions.bash

_blargh_completions () {
    COMPREPLY=...
}

_blargh_init_completions () {
    local blargh
    for blargh in blarghABC blarghXYZ blargh123 blarghXXX-debug blarghARGH ; do
        complete -F _blargh_completions "$blargh"
        complete -F _blargh_completions "./$blargh"
    done
}

_blargh_init_completions

처음에는 응용 프로그램 이름을 추측할 수 있었지만 여전히 사용자에게 스크립트를 다시 확인하고 for필요에 따라 루프에서 로컬 복사본을 업데이트하도록 지시해야 하는데 이는 이상적이지 않습니다.

그리고 내가 어디로 가는지 조금 불분명하다.설치하다여러 프로그램의 완료 스크립트를 처리합니다.모든 옵션단점이 있습니다:

  • 내가 넣을 수 있어호환성 카탈로그(예 /etc/bash_completion.d/): 이를 통해 스크립트가 여러 명령을 사용할 수 있지만 동시에 모든 문서에서는 이 위치가 더 이상 사용되지 않으며 사용해서는 안 된다고 명시합니다.
  • 내가 넣을 수 있어전체 목차(예 /usr/share/bash-completion/completions/: ): 단, 스크립트는 이 디렉터리의 명령과 동일한 이름을 가져야 하므로 이 경우 어떻게 작동하게 해야 할지 모르겠습니다.
  • ~/.bash_completion자동 업데이트/제거가 어려워지지 않는 한 사용자 파일에 추가할 수 있습니다 .

그래서 내 질문은 다음과 같습니다가능하다면 blargh*정확한 명령 이름을 미리 알지 못한 채 와일드카드 이름 패턴으로 작동하는 완성 스크립트를 어떻게 작성하고 설치할 수 있습니까?

답변1

안타깝게도 이 complete명령은 명령 이름 와일드카드/접두사를 지원하지 않습니다.

blargh그러나 접미사(내 생각에는 하위 명령 이름)를 사용 하는 래퍼 함수를 ​​도입한 다음 이에 대한 bash 완료 함수를 생성할 수 있습니다 .


blargh() {
    command "blargh$@"
}

_blargh_completion() {
    ((COMP_CWORD >= 1)) || return
    local subcommand="${COMP_WORDS[1]}"
    if ((COMP_CWORD == 1)); then
        # ${subcommand} is a prefix
        # emit subcommand names that start with it
    else
        # complete arguments for the ${subcommand}
    fi
}

complete -F _blargh_completion blargh

이 메서드 blarghcreate ...도 호출할 수 blargh create ...있으며 후자의 호출 메서드는 자동으로 완료될 수 있습니다. 그런 다음 /usr/share/bash-completion/completions/blargh기술적으로는 명령의 완성이기 때문에 넣을 수 있습니다 blargh. :-)

관련 정보