현재 상황은 바이너리가 모두 동일한 접두사로 시작하는 일련의 애플리케이션에 대해 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
. :-)