GeekFactory

int128.hatenablog.com

kubectl completionの遅延実行によるzshの起動時間短縮

kubectl にはシェルの補完機能が用意されています。 .zshrc で補完機能を有効化するとzshの起動に時間がかかるため、補完機能の有効化を遅延実行するようにしてみました。

具体的には、 kubectl コマンドの初回実行時のみ source <(kubectl completion zsh) を実行します。

function kubectl () {
  local kubectl="$(whence -p kubectl 2> /dev/null)"
  [ -z "$_lazy_kubectl_completion" ] && {
    echo "\e[31m$0 completion zsh\e[0m" > /dev/stderr
    source <("$kubectl" completion zsh)
    _lazy_kubectl_completion=1
  }
  "$kubectl" "$@"
}

初回実行時:

% time ( kubectl )
kubectl completion zsh
kubectl controls the Kubernetes cluster manager.
...
( kubectl; )  0.98s user 0.38s system 115% cpu 1.168 total

2回目以降:

% time ( _lazy_kubectl_completion=1 kubectl )
kubectl controls the Kubernetes cluster manager.
...
( _lazy_kubectl_completion=1 kubectl; )  0.13s user 0.02s system 111% cpu 0.141 total

zshの起動に1秒近くかかってしまう問題を解決できました。もっとスマートな解決法を知っていたら教えてください。