コマンド利用するのに補完機能は欠かせない

lsとかcdでタブキーをトントンッと2回叩くとカレントディレクトリ以下のディレクトリやファイル名がリストされますよね。これが補完です。

bashの補完機能はcomplete組み込みコマンドで実現

bashの補完機能は組み込みコマンドのcompleteコマンドで実現しています。completeコマンドはオプションが豊富なので基本的なオプションの使い方のみご紹介します。

  • 全設定の表示
1
2
3
4
5
6
7
8
9
10
11
# complete -p | head
complete -F _kill kill
complete -F _renice renice
complete -F _pgrep pidof
complete -F _postconf postconf
complete -F _java java
complete -F _stream stream
complete -F _update_alternatives alternatives
complete -F _filedir_xspec oodraw
complete -F _filedir_xspec elinks
complete -F _filedir_xspec freeamp
  • lsコマンドの設定のみ表示
1
2
# complete -p ls
complete -o default -F _longopt ls

man completeを見ると情報量が多いので詳細はまた今度確認することにしますが、上記lsコマンドの補完設定の概要は、-o defaultでオプションを指定し、-F _longoptで実行するシェル関数を指定しているようです。_longopt関数に関して興味があればtype -a _longoptを実行してみましょう。

bash-completionをインストールする

bash補完を更に便利にするためにbash-completionをインストールします。

See: https://github.com/GArik/bash-completion
See: https://alioth.debian.org/projects/bash-completion/

RHEL系

1
yum -y install bash-completion

MacOSX

  • Macのbrewで入れたパッケージのインストールプレフィックスは/usr/local
  • デフォルトでは/usr/local/etc/bash_completion設定ファイルが読み込まれないので~/.bash_profileへ追記
1
2
3
4
5
6
7
8
9
10
brew install bash-completion

cat << EOT >> ~/.bash_profile
# bash-completion
if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi
EOT

source ~/.bash_profile

bash-completionだけでは補完されないコマンドの補完

bash-completionでは補完機能を拡張することができます。Macでは/usr/local/etc/bash_completion.dに、RHEL系では/etc/bash_completion.dに拡張ファイルを置き、ログインし直すか~/.bash_profileを再読み込みすることで有効になります。

gitコマンド補完

1
2
wget -O /usr/local/etc/bash_completion.d/git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
source ~/.bash_profile

vagrantコマンド補完

1
2
wget -O /usr/local/etc/bash_completion.d/vagrant https://raw.githubusercontent.com/kura/vagrant-bash-completion/master/etc/bash_completion.d/vagrant
source ~/.bash_profile

これは本当に便利!!