やりたいこと
kubectlコマンドのサブコマンドを[TAB]キーで補完できるようにしたい。
環境情報
$ kubectl version ... Client Version: version.Info{Major:"1", Minor:"17", ...
bash --version GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
やり方
completion
を用いて補完用の設定項目をファイルに吐き出し
kubectl completion bash > test.txt
同ファイルをログインシェルで読むように指定し
$ echo "source ./test.txt" >> .bashrc
同設定ファイルを読み込めば
$ source .bashrc
タブキーで候補が表示される。
$ kubectl get e endpoints endpointslices.discovery.k8s.io events events.events.k8s.io
以下、補足です。
補足
kubectlコマンドのマニュアルを見れば分かりますが以下のように設定用コマンドがデフォルトで利用できます。
Settings Commands: label Update the labels on a resource annotate Update the annotations on a resource completion Output shell completion code for the specified shell (bash or zsh)
この「completion」はまさしく保管用のシェルを出力してくれます。
ファイルの中身は以下のように大量のテキストで構成されており例えばkubectl top
用の設定箇所の一部を見てみると以下のようになっています。
_kubectl_top() { last_command="kubectl_top" command_aliases=() commands=() commands+=("node") if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then command_aliases+=("no") aliashash["no"]="node" command_aliases+=("nodes") aliashash["nodes"]="node" fi commands+=("pod") if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then command_aliases+=("po") aliashash["po"]="pod" command_aliases+=("pods") aliashash["pods"]="pod" fi ... flags+=("--add-dir-header") flags+=("--alsologtostderr") flags+=("--as=") two_word_flags+=("--as") flags+=("--as-group=") two_word_flags+=("--as-group") flags+=("--cache-dir=") ... must_have_one_flag=() must_have_one_noun=() noun_aliases=() }
環境によってはタブキーを押下した際に効かない場合も有、例えばCygwinというWindows系のOS用ソフトであれば以下のようなエラーになりました。(※GNU bash, バージョン 4.4.12(3)-release x86_64-unknown-cygwin)
$ kubectl get de-bash: _get_comp_words_by_ref: コマンドが見つかりません -bash: _get_comp_words_by_ref: コマンドが見つかりません
終わり
意外と知らないKubernetes利用時の便利コマンドでした。尚、以下コマンドを押下すれば
$ kubectl api-resources
各オブジェクト名とその短縮名も取得できるのでこれを活かせば尚操作しやすくなると思います。