내 프로그램은 다음 형식을 사용할 수 있습니다.
<command_name> <arguments> <options> -hosts <host1> <host2> ... <hostn> (<more_arguments>) ...
다음을 기반으로 bash 자동 완성을 설정하려고합니다.데비안 관리기사에서는 다음과 같이 호스트 완료를 완료했습니다.
(...)
case "${prev}" in
-hosts)
_known_hosts_real -a "$cur"
return 0
;;
(...)
(...)
물론, -hosts
bash는 작성 후 단일 호스트의 이름을 완성할 수 있지만 여러 호스트의 이름은 완성할 수 없습니다. 이외의 다른 매개변수를 처리하므로 호스트를 완료하지 않고 이 해킹을 구현할 수 있는 멋진 방법이 있습니까 -hosts
?
답변1
대소문자를 무시하면 이전 단어 중 하나인지 (<more_arguments>)
확인할 수 있습니다 .-hosts
(...)
for ((i=1;i<COMP_CWORD;i++)); do
if [ "-hosts" == "${COMP_WORDS[i]}" ]; then
_known_hosts_real -a "$cur"
return 0
fi
done
case "${prev}" in
답변2
공백으로 구분된 호스트 값에 대해 이와 같은 자동 완성 규칙을 만드는 것이 가능한지 잘 모르겠습니다. 하지만 쉼표로 구분된 목록을 사용해도 괜찮다면 다음을 수행하세요.
_myhost () {
local cur prev opts
_get_comp_words_by_ref cur prev
opts='-hosts'
servers='name1 name2 name3'
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
else
case "${prev}" in
-hosts)
if [[ "$cur" == *,* ]]; then
local realcur prefix
realcur=${cur##*,}
prefix=${cur%,*}
COMPREPLY=( $(compgen -W "${servers}" -P "${prefix}," -- ${realcur}) )
else
COMPREPLY=( $(compgen -W "${servers}" -- ${cur}) )
fi
;;
*)
# do nothing
;;
esac
fi
}
complete -F _myhost myhost