斎藤です。こんにちは。
今日は、bashコマンドの補完を強化する bash-completion[1] をインストールしてみよう、というお話です。
先日執筆した記事『デーモンの起動・終了にはserviceコマンドを利用しよう』の反響の中に「serviceコマンドは補完が効かない」というコメントを頂いていました。こちらですが、 bash-completion を入れると補完が効くようになります。そこで、先日の記事の補足として、お話ししたいと思います。
※ bash-completion は1.2を用いています
そもそも bash-completion で何ができるの?
bash-completion は、次のコマンドの入力補完を行えるようにするためのソフトウェアです。次のコマンドが対象となっています。
$ pwd
/tmp/bash-completion-1.2/contrib
$ ls
_mock cksfv getent lilo mysqladmin rdesktop sysv-rc
_modules clisp gkrellm links ncftp reportbug tar
_subversion configure gnatmake lintian net-tools resolvconf tcpdump
_yum coreutils gpg lisp nmap rfkill unace
_yum-utils cowsay gpg2 lvm ntpdate ri unrar
abook cpan2dist gzip lzma openldap rpcdebug update-alternatives
ant cpio heimdal lzop openssl rpm util-linux
apache2ctl cryptsetup hping2 mailman p4 rpmcheck vncviewer
apt cups iconv make perl rrdtool vpnc
apt-build cvs ifupdown man pine rsync wireless-tools
aptitude cvsps imagemagick mc pkg-config rtcwake wodim
aspell dd info mcrypt pkg_install samba wol
autorpm dhclient ipmitool mdadm pkgtools sbcl wtf
bash-builtins dict ipsec medusa pm-utils screen wvdial
bind-utils dpkg iptables minicom portupgrade service xhost
bitkeeper dselect ipv6calc mkinitrd postfix shadow xm
bittorrent dsniff isql module-init-tools postgresql sitecopy xmllint
bluez findutils jar monodevelop povray smartctl xmlwf
brctl freeciv java mount procps snownews xmms
bzip2 fuse k3b mplayer python ssh xrandr
cardctl gcc kldload msynctool qdbus sshfs xsltproc
cfengine gcl larch mtx qemu strace xz
chkconfig gdb ldapvi munin-node quota-tools svk yp-tools
chsh genisoimage lftp mutt rcs sysctl yum-arch
例えば、すぐに役に立ちそうなものとして、次のものがあります。
- serviceコマンド実行時のデーモン名の補完
- sshコマンド実行時のホスト名・IPアドレスの補完 (hosts, known_hosts, ssh/config を基にしている)
- manコマンドのコマンド名の補完
なお、中身はbashスクリプトとなっています。
インストール方法
RedHat, CentOS, Fedora
まず、"bash-completion"パッケージがインストールされているかを確認します。
$ rpm -qa | grep bash-completion
"bash-completion"パッケージが表示されていればインストールされていますので、以下の作業は不要です。
あわせて、ソースからインストールしている場合も考慮し、"complete"コマンドを打って確認してみます。
$ complete
出てくる結果が数百行ある場合は、恐らく入っていますので、以下の作業は不要です。
続いて、epelリポジトリが有効であるかを確認します。有効である場合、次の通りリポジトリ名が表示されます。
$ yum repolist | grep epel
* epel: ftp.iij.ad.jp
epel Extra Packages for Enterprise Linux 6 - x86_64 9,145
リポジトリ名が表示されない、すなわち無効の場合は、Fedora Projectのepelのページからリポジトリを設定するパッケージをダウンロードします。"How can I use these extra packages?"あたりに設定のためのリンクがあります。
アクセス先: EPEL - FedoraProject
epelリポジトリが有効になりましたら、パッケージをインストールします。
# yum install bash-completion
以上で完了です。
Debian, Ubuntu
まず、"bash-completion"パッケージがインストールされているかを確認します。
$ dpkg -l | grep bash-completion
"bash-completion"パッケージが表示されていればインストールされていますので、以下の作業は不要です。
続いて、次の手順でインストールします。
# apt-get install bash-completion
以上で完了です。
ソースから
ソースからインストールする場合は、一手間かかります。
Redhat, CentOS, Fedoraなどで、epelリポジトリを有効にしたくない場合に用います。
# cd /usr/local/src
# wget http://bash-completion.alioth.debian.org/files/bash-completion-1.2.tar.gz
# ./configure --prefix=''
# make
# make install
# cp -a bash_completion.sh /etc/profile.d/
# chmod +x /etc/profile.d/bash_completion.sh
なお、Redhat, CentOS, Fedoraでは、serviceコマンドの補完が正常に動かない場合があります。その際は、Fedora Projectのリポジトリにある、次のパッチを適用してください。
パッチ頒布ページ: bash-completion.git - bash-completion
その他 テクニック
同僚から教わったテクニックをご紹介します。ちょっとした、生活の知恵としてご覧ください。
デーモン名の補完
service, chkconfigコマンドでデーモン名を補完する際、"/etc/init.d"ディレクトリに移って、コマンドを実行しようとすると、補完が効きます。これは、bash-completionが無くても利用でき、"/etc/init.d"ディレクトリ以下のファイル名(=デーモン名)で補完しようとするのをうまく使っています。手軽で良いですね。
オリジナル補完機能の作成
自作したコマンドの補完機能の実装のために、bash-completion にスクリプトを追加することもできます。
"/etc/bash-completion.d"ディレクトリに、設定したシェルスクリプトを保存します。設定方法は、他のスクリプトを参考にすると良いかと思います。
おわりに
ここまで、 bash-completion によってserviceのデーモン名やsshのホスト名をより楽に入力できる事、 及び bash-completion のインストール方法をご紹介しました。
また、コマンドを全て手でタイプする事が減れば、ミスの軽減にもつながります。
より良いサーバ運用環境の構築の一助になりましたら、幸いです。
それでは、ごきげんよう。
参考文献
- [1] Bash-Completion