如何在调用 kubectl 的函数上启用自动完成子命令

Jan*_*jka 2 bash autocomplete kubectl

假设您想节省编写所有kubectl命令的时间:kubectl describe pods以更短的方式:k d p

所以解决方案是添加功能~/.bashrc

k() {
  cmd_kubectl="command kubectl"
  case ${1} in
    g)
      shift
      kubectl_get="${cmd_kubectl} get"
      case ${1} in
        p)
          shift
          ${kubectl_get} pods "$@"
          ;;
        d)
          shift
          ${kubectl_get} deploy "$@"
          ;;
        n)
          shift
          ${kubectl_get} ns "$@"
          ;;
        i)
          shift
          ${kubectl_get} ing "$@"
          ;;
        j)
          shift
          ${kubectl_get} job "$@"
          ;;
        *)
          ${kubectl_get} "$@"
          ;;
      esac
      ;;
    d)
      shift
      kubectl_desc="${cmd_kubectl} describe"
      case ${1} in
        p)
          shift
          ${kubectl_desc} pods "$@"
          ;;
        d)
          shift
          ${kubectl_desc} deploy "$@"
          ;;
        n)
          shift
          ${kubectl_desc} ns "$@"
          ;;
        i)
          shift
          ${kubectl_desc} ing "$@"
          ;;
        j)
          shift
          ${kubectl_desc} job "$@"
          ;;
        *)
          ${kubectl_desc} "$@"
          ;;
      esac
      ;;
    *)
      ${cmd_kubectl} "$@"
      ;;
  esac
}
Run Code Online (Sandbox Code Playgroud)

但我想节省精力并进一步改进它,所以我的问题是:

如何启用此功能的自动完成功能以允许填充例如 Pod 的名称?

用法:

k d p-> Tab-> k d p nginx(结果)

我试图想出以下参考文献,但可能我没有足够经验的 Linux 用户/开发人员来编写最终的解决方案。

提前致谢!

mat*_*t_j 5

我也想让编写命令变得更容易kubectl,但我以稍微不同的方式解决了这个问题。

我将在下面描述此方法,因为我认为您可能会发现它很有用。


我将所有必要的文件保存在~/.bash_completion.d目录中,但您可以根据需要对其进行修改。

$ mkdir ~/.bash_completion.d
Run Code Online (Sandbox Code Playgroud)

首先,我启用了 kubectl 自动完成功能,如 Kubernetes文档中所述:

kubectl completion bash > ~/.bash_completion.d/kubectl
Run Code Online (Sandbox Code Playgroud)

然后我下载了complete-alias - automagical shell别名补全:
注意:更多信息可以在这里complete-alias找到。

$ curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias > ~/.bash_completion.d/complete_alias
Run Code Online (Sandbox Code Playgroud)

接下来,我kubectl_aliases使用要使用的别名创建了文件:

$ cat ~/.bash_completion.d/kubectl_aliases
alias kgp='kubectl get pods'
complete -F _complete_alias kgp
alias kgd='kubectl get deploy'
complete -F _complete_alias kgd
alias kgn='kubectl get ns'
complete -F _complete_alias kgn
alias kgi='kubectl get ing'
complete -F _complete_alias kgi
alias kgj='kubectl get job'
complete -F _complete_alias kgj
alias kg='kubectl get'
complete -F _complete_alias kg
Run Code Online (Sandbox Code Playgroud)

最后,我们可以从目录中的文件执行命令~/.bash_completion.d并检查它是否按预期工作:

$ source  ~/.bash_completion.d/kubectl
$ source  ~/.bash_completion.d/complete_alias 
$ source  ~/.bash_completion.d/kubectl_aliases 
Run Code Online (Sandbox Code Playgroud)

kgp输入并按两次后Tab,我们可以选择 Pod:

$ kgp 
app-1      nginx      webserver
$ kgp app-1 
NAME    READY   STATUS    RESTARTS   AGE
app-1   1/1     Running   0          5m28s
Run Code Online (Sandbox Code Playgroud)