我的程序可以采用以下格式:
<command_name> <arguments> <options> -hosts <host1> <host2> ... <hostn> (<more_arguments>) ...
我正在尝试设置 bash 自动完成,并基于Debian 管理的文章中,我已经完成了这样的主机补全:
(...)
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