如何为调用kubectl的自定义shell函数启用子命令自动补全
解决方案
前置依赖
首先确保kubectl原生bash自动补全已启用,在~/.bashrc中添加以下内容(如果还没加的话):
source <(kubectl completion bash)
这一步是基础,我们的自定义补全会直接复用kubectl官方的补全逻辑,不需要自己实现资源名的抓取筛选。
自定义k函数的补全逻辑
在你之前定义的k函数后面,添加如下补全代码:
_k_completion() { local cur prev words cword _init_completion || return # 把自定义缩写转换为kubectl原生参数 local transformed_words=("kubectl") local i=1 # 处理第一个参数:g->get, d->describe if [[ $i -lt ${#words[@]} ]]; then case ${words[$i]} in g) transformed_words+=("get") ;; d) transformed_words+=("describe") ;; *) transformed_words+=("${words[$i]}") ;; esac ((i++)) fi # 处理第二个参数:资源类型缩写 if [[ $i -lt ${#words[@]} ]]; then case ${words[$i]} in p) transformed_words+=("pods") ;; d) transformed_words+=("deploy") ;; n) transformed_words+=("ns") ;; i) transformed_words+=("ing") ;; j) transformed_words+=("job") ;; *) transformed_words+=("${words[$i]}") ;; esac ((i++)) fi # 剩余参数直接透传 while [[ $i -lt ${#words[@]} ]]; do transformed_words+=("${words[$i]}") ((i++)) done # 替换当前words和cword,调用kubectl原生补全 words=("${transformed_words[@]}") cword=$(( ${#transformed_words[@]} - 1 )) __start_kubectl kubectl "$cur" } # 绑定补全函数到k命令 complete -F _k_completion k
生效方式
保存~/.bashrc后执行source ~/.bashrc即可立即生效。
验证
输入k g p后按Tab,会自动补全当前命名空间下的Pod名称;输入k d d按Tab会自动补全Deployment名称,体验和原生kubectl完全一致。
内容的提问来源于stack exchange,提问作者Jan Matějka
相关产品推荐
相关产品推荐

