【问题标题】:How to enable autocomplete subcommnads on function that's call kubectl如何在调用 kubectl 的函数上启用自动完成子命令
【发布时间】:2021-12-01 00:14:13
【问题描述】:

假设您想节省时间编写所有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
}

但是我想省点力气多改进一下,所以我的问题是:

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

用法:

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

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

提前致谢!

【问题讨论】:

  • 一直在考虑做这样的事情,虽然我确信有办法改进(设计方面),但我仍然会说相当不错的尝试。不过,在这种情况下,自动完成似乎很难,不是吗?就像您在执行命令时需要该功能来了解/查询 pod 一样吗?也许使用 grep 至少可以帮助将其汇集起来,例如k d p nginx 实际上会转换为 kubectl describe pods | grep "nginx" 但也许您真的在寻找针对特定用例的自动完成功能。还是把它收藏起来!
  • 是的,我没想到这会很容易。 :) 我理解你的意思是在自动完成逻辑中使用 grep 吗?也许我完全出局了,无法想象解决方案。

标签: bash autocomplete kubectl


【解决方案1】:

我还想让kubectl 命令的编写更容易,但我以稍微不同的方式解决了它。

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


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

$ mkdir ~/.bash_completion.d

首先,我启用了 kubectl 自动补全功能,如 Kubernetes documentation 中所述:

kubectl completion bash > ~/.bash_completion.d/kubectl

然后我下载了 complete-alias - 自动完成 shell 别名:
注意:更多关于 complete-alias 的信息可以在 here 找到。

$ curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias > ~/.bash_completion.d/complete_alias

接下来我创建了 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

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

$ source  ~/.bash_completion.d/kubectl
$ source  ~/.bash_completion.d/complete_alias 
$ source  ~/.bash_completion.d/kubectl_aliases 

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

$ kgp 
app-1      nginx      webserver
$ kgp app-1 
NAME    READY   STATUS    RESTARTS   AGE
app-1   1/1     Running   0          5m28s

【讨论】:

  • 为命令和子命令的每个组合设置别名是非常简单的方法。但我更喜欢使用子命令并尝试找到方便的解决方案来实现它。无论如何,仍然感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多