bash 완료: 특정 매개변수에 대한 호스트 목록을 완성하는 방법은 무엇입니까?

bash 완료: 특정 매개변수에 대한 호스트 목록을 완성하는 방법은 무엇입니까?

내 프로그램은 다음 형식을 사용할 수 있습니다.

<command_name> <arguments> <options> -hosts <host1> <host2> ... <hostn> (<more_arguments>) ...

다음을 기반으로 bash 자동 완성을 설정하려고합니다.데비안 관리기사에서는 다음과 같이 호스트 완료를 완료했습니다.

(...)
case "${prev}" in
    -hosts)
        _known_hosts_real -a "$cur"
        return 0
        ;;
    (...)
(...)

물론, -hostsbash는 작성 후 단일 호스트의 이름을 완성할 수 있지만 여러 호스트의 이름은 완성할 수 없습니다. 이외의 다른 매개변수를 처리하므로 호스트를 완료하지 않고 이 해킹을 구현할 수 있는 멋진 방법이 있습니까 -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

관련 정보