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

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

```bash: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を用いてインストールします。

```bash:Terminal
brew install bash-completion
```

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

```bash:.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 `にて確認可能です。

```bash: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

```bash
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

```bash
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

```bash
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

```bash
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)

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

## ansible系(NonOfficial)

```bash
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

```bash
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が有効になっています。