bash auto-completion on macOS

Some optional configuration for bash auto-completion on macOS.

Introduction

The kubectl completion script for Bash can be generated with kubectl completion bash. Sourcing this script in your shell enables kubectl completion.

However, the kubectl completion script depends on bash-completion which you thus have to previously install.

Warning: There are two versions of bash-completion, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+. The kubectl completion script doesn’t work correctly with bash-completion v1 and Bash 3.2. It requires bash-completion v2 and Bash 4.1+. Thus, to be able to correctly use kubectl completion on macOS, you have to install and use Bash 4.1+ (instructions). The following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).

Upgrade Bash

The instructions here assume you use Bash 4.1+. You can check your Bash’s version by running:

  1. echo $BASH_VERSION

If it is too old, you can install/upgrade it using Homebrew:

  1. brew install bash

Reload your shell and verify that the desired version is being used:

  1. echo $BASH_VERSION $SHELL

Homebrew usually installs it at /usr/local/bin/bash.

Install bash-completion

Note: As mentioned, these instructions assume you use Bash 4.1+, which means you will install bash-completion v2 (in contrast to Bash 3.2 and bash-completion v1, in which case kubectl completion won’t work).

You can test if you have bash-completion v2 already installed with type _init_completion. If not, you can install it with Homebrew:

  1. brew install bash-completion@2

As stated in the output of this command, add the following to your ~/.bash_profile file:

  1. export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d"
  2. [[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"

Reload your shell and verify that bash-completion v2 is correctly installed with type _init_completion.

Enable kubectl autocompletion

You now have to ensure that the kubectl completion script gets sourced in all your shell sessions. There are multiple ways to achieve this:

  • Source the completion script in your ~/.bash_profile file:

    1. echo 'source <(kubectl completion bash)' >>~/.bash_profile
  • Add the completion script to the /usr/local/etc/bash_completion.d directory:

    1. kubectl completion bash >/usr/local/etc/bash_completion.d/kubectl
  • If you have an alias for kubectl, you can extend shell completion to work with that alias:

    1. echo 'alias k=kubectl' >>~/.bash_profile
    2. echo 'complete -F __start_kubectl k' >>~/.bash_profile
  • If you installed kubectl with Homebrew (as explained here), then the kubectl completion script should already be in /usr/local/etc/bash_completion.d/kubectl. In that case, you don’t need to do anything.

    Note: The Homebrew installation of bash-completion v2 sources all the files in the BASH_COMPLETION_COMPAT_DIR directory, that’s why the latter two methods work.

In any case, after reloading your shell, kubectl completion should be working.