bash-completionでserviceコマンドなどの補完を強化しよう

斎藤です。こんにちは。

今日は、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 のインストール方法をご紹介しました。

また、コマンドを全て手でタイプする事が減れば、ミスの軽減にもつながります。

より良いサーバ運用環境の構築の一助になりましたら、幸いです。

それでは、ごきげんよう。

参考文献

株式会社ハートビーツのインフラエンジニアから、ちょっとした情報をお届けします。