[bash-completion]TABキーでコマンドを補完する


bash-completion を導入すると

ターミナルで<TAB>を押下した際に、現在の入力状況に応じて、続くコマンドなどが自動補完されるようになります。
例えば、dockerと入力したあとに<TAB>とすると、以下のようにdockerで利用可能なコマンドが羅列されます。

Terminal
$ docker <TAB>
attach     container  engine     history    inspect    logs       port       restart    search     stats      top        volume
build      context    events     image      kill       network    ps         rm         secret     stop       trust      wait
builder    cp         exec       images     load       node       pull       rmi        service    swarm      unpause    
commit     create     export     import     login      pause      push       run        stack      system     update     
config     diff       help       info       logout     plugin     rename     save       start      tag        version

前提

Mac OSでのbash利用を前提としたコマンドを記載します。

bash-completionの導入

Homebrewを用いてインストールします。

Terminal
brew install bash-completion

つづいて、.bash_profileにcompletionを読み込むコマンドを記載します。

.bash_profile
if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

ここで一度Command + Qでターミナルを終了させて再起動させるか、. $(brew --prefix)/etc/bash_completionなどで.bash_profileに追記した部分を読み込ませるようにしてください。

この時点でいくらかのbashコマンドに補完が効くようになります。補完対象となるコマンドはls -l $(brew --prefix)/etc/bash_completion.dにて確認可能です。

Terminal
$ ll $(brew --prefix)/etc/bash_completion.d
total 536
lrwxr-xr-x  1 mintak  admin      62  1  5 00:00 abook -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/abook
lrwxr-xr-x  1 mintak  admin      60  1  5 00:00 ant -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/ant
lrwxr-xr-x  1 mintak  admin      67  1  5 00:00 apache2ctl -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/apache2ctl
lrwxr-xr-x  1 mintak  admin      60  1  5 00:00 apt -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/apt
lrwxr-xr-x  1 mintak  admin      66  1  5 00:00 apt-build -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/apt-build
lrwxr-xr-x  1 mintak  admin      65  1  5 00:00 aptitude -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/aptitude
lrwxr-xr-x  1 mintak  admin      63  1  5 00:00 aspell -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/aspell
lrwxr-xr-x  1 mintak  admin      65  1  5 00:00 autoconf -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/autoconf
lrwxr-xr-x  1 mintak  admin      65  1  5 00:00 automake -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/automake
lrwxr-xr-x  1 mintak  admin      64  1  5 00:00 autorpm -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/autorpm
lrwxr-xr-x  1 mintak  admin      53 12 22 12:37 bash -> ../../Cellar/heroku/7.35.1/etc/bash_completion.d/bash
lrwxr-xr-x  1 mintak  admin      70  1  5 00:00 bash-builtins -> ../../Cellar/bash-completion/1.3_3/etc/bash_completion.d/bash-builtins
・・・・・・(以下略)

各種コマンドへの補完対応

dockerなどのプリインストールされていないコマンドに対する補完は上記だけでは有効になりません。それぞれに必要となる補完用スクリプトをcompletionディレクトリに配置して、読み込ませる必要があります。1
いくつか具体的なコマンドで例を紹介しておきます。

docker

curl -L https://raw.githubusercontent.com/docker/docker-ce/$(docker --version \
| awk -F' ' '{print $3}' | cut -c 1-5)/components/cli/contrib/completion/bash/docker \ 
> $(brew --prefix)/etc/bash_completion.d/docker

docker-compose

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose \
> $(brew --prefix)/etc/bash_completion.d/docker-compose

git

curl -L https://raw.githubusercontent.com/git/git/v$(git version | awk -F' ' '{print $3}')/contrib/completion/git-completion.bash \
> $(brew --prefix)/etc/bash_completion.d/git

vagrant

curl -L https://raw.githubusercontent.com/hashicorp/vagrant/v$(vagrant -v | awk -F' ' '{print $2}')/contrib/bash/completion.sh \
> $(brew --prefix)/etc/bash_completion.d/vagrant

kubectl(Kubernetes)

kubectl completion bash \
> $(brew --prefix)/etc/bash_completion.d/kubectl

ansible系(NonOfficial)

curl -L https://raw.githubusercontent.com/dysosmus/ansible-completion/master/ansible-completion.bash\
 > $(brew --prefix)/etc/bash_completion.d/ansible

curl -L https://raw.githubusercontent.com/dysosmus/ansible-completion/master/ansible-playbook-completion.bash\
 > $(brew --prefix)/etc/bash_completion.d/ansible-playbook

curl -L https://raw.githubusercontent.com/dysosmus/ansible-completion/master/ansible-vault-completion.bash\
 > $(brew --prefix)/etc/bash_completion.d/ansible-vault

terraform

echo "complete -C /usr/local/Cellar/tfenv/1.0.2/versions/0.12.20/terraform terraform" \
> $(brew --prefix)/etc/bash_completion.d/terraform

※echoの内容はterraform -install-autocompleteによって.bashrcに追加された内容

リポジトリにはterraform -install-autocompleteを実行するように記載されていますが、
これだと.bashrcに記述が追加されてしまいます。
そこで他とあわせてbash_completion.dディレクトリに埋め込むようにしています。


  1. dockerやgitなどをhomebrew経由ですでに導入済みの場合、続く作業を行わなくともシンボリックリンクがはられて有効になることもあるようです。ls -l $(brew --prefix)/etc/bash_completion.d/ | grep docker(grep 部分を確認対象に変更して確認)で結果が戻ってくる場合は、すでにCompletionが有効になっています。