bash-completionを活用して、manやhelpを見ずに、バシバシ長いコマンドを打つ
1. 入力補完機能を使っていますか?
bashをはじめとして、多くのシェルやコマンドプロンプトで入力補完機能(completion)が提供されている。Windowsでも使える機能だし、ほとんどの人が使っているだろう。
$ ls sample.txt test1.txt test2.txt test3.txt $ cat s[TAB]キー入力 $ cat sample.txt ★TABキーを押すと、一致するファイル名が補完される
そしてRHEL6(2010年代~)あたりからは、ファイル名やディレクトリ名だけでなく、コマンドのオプション入力にも使えるようになっている。
1-1.前提条件
1-2. TL;DR
- 入力補完機能は使っていたが、Linuxコマンドのオプション入力で使えるのは知らなかった。恥ずかしい…。
2. systmctlのオプション長げー問題
ここ数年はRHEL7系をメインに使っているが、長らくRHEL5/RHEL6系を使ってきた。RHEL7系で戸惑うのはservice
コマンドやchkconfig
コマンドが使えないことだ(一部は互換機能で使える)。
システム構築・運用でよく使うコマンドなので「chkconfig --list
って、systemctl
だと何だったっけ…」となりがちである。
そんなときに役立つのがコマンド・オプションの入力補完機能だ。
次のようにsystemctl
のあとに「TABキー」を入力すると、オプションの一覧を表示できる。
$ sudo systemctl [TAB]キー入力 ★systemctlのあとに1スペース入れてからTAB add-requires hybrid-sleep reload-or-restart add-wants is-active reload-or-try-restart cancel is-enabled rescue cat is-failed reset-failed condreload isolate restart condrestart is-system-running set-default condstop kexec set-environment daemon-reexec kill set-property daemon-reload link show default list-dependencies show-environment delete list-jobs snapshot disable list-sockets start edit list-timers status emergency list-unit-files stop enable list-units suspend exit mask switch-root force-reload poweroff try-restart get-default preset unmask halt reboot unset-environment help reenable hibernate reload
一覧が表示されれば、こちらのもの。続いてlist-unit-files
を入力すればよい。オプションを入力してる途中も「TABキー」の入力補完は効く。
$ sudo systemctl list-unit-files ★list-unit-filesの途中でもTABの補完が効く
これでsystemctl
も怖くない! えっへん!
3. bash-completionとは
ファイル名やディレクトリ名の入力補完では無く、コマンドのオプションを補完するのがbash-completionだ。complete -p
を入力して大量の行が表示されるならば利用できると思っていい。
3-1. ディストリビューションごとの状況
Linuxディストリビューションの種類やバージョンによって、標準リポジトリに含まれていないことがある。
$ rpm -q bash-completion bash-completion-2.7-5.el8.noarch
$ rpm -q bash-completion bash-completion-2.1-6.el7.noarch
$ rpm -q bash-completion package bash-completion is not installed
$ dpkg -l bash-completion ||/ Name Version Architecture Description +++-==============-============-============-================================= ii bash-completio 1:2.8-1ubunt all programmable completion for the b
少し古いので現在当てはまるか微妙だが、MacOSの情報はこちら。
3-2. RHEL6系OSへのインストール
RHEL6やCentOS 6、Oracle Linux 6では、bash-completionをEPELリポジトリからインストールする必要がある。その手順を説明する。
- EPELリポジトリが有効になっているか確認する。次のように行が存在し、enabledになっていれば利用できる。
$ yum repolist all | grep -i epel epel Extra Packages for Enterprise Linux enabled: 12,586
2.上記以外のときは状況に応じてEPELリポジトリを有効にする。
行はあるがdisabledのとき
$ sudo yum-config-mangaer --enable epel
行自体がないとき
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm -y
3.次のように「Available Packages」に表示されたときは、インストールされていないが、リポジトリには存在している。
$ sudo yum list bash-completion Loaded plugins: refresh-packagekit, security, ulninfo Available Packages bash-completion.noarch 1:1.3-7.el6 epel
4.ここまで確認できたらbash-completionをインストールする。
$ sudo yum install bash-completion -y
5.bash-completionを有効にするためにログアウト/ログインする。ログアウトする理由は/etc/profile.d/bash_completion.sh
でbash-completionの定義ファイルを読むためだ。
3-3. bash-completionの定義ファイル
bash-completionの定義ファイルは、次のディレクトリ配下に存在する。
ディレクトリを確認すると大量の定義ファイルがある。このファイルがあるコマンドは、オプションの入力補完ができることになる。
$ ls /usr/share/bash-completion/completions/ | wc -l 454 $ ls /usr/share/bash-completion/completions/ addpart fsck.minix lvextend raw timedatectl blkdiscard fsfreeze lvm readprofile tuned-adm blkid fstrim lvmdiskscan rename udevadm blockdev gapplication lvreduce renice ul bootctl gdbus lvremove repquota umount busctl getopt lvrename resizepart unshare bzip2 groupadd lvresize rev useradd cal groupdel lvs rpm userdel cfdisk groupmod lvscan rtcwake usermod ★以下省略
3-4. 入力補完例いろいろ
先ほどのsystemctl
の例ではlist-unit-files
オプションを補完した。それ以外にもハイフン(-
)やハイフンハイフン(--
)で始まるオプションも入力補完できる。
$ sudo systemctl -[TAB]キー入力 -a --ignore-dependencies --quiet --after --kill-who -r --all -l --recursive --before --no-ask-password --reverse --defaults --no-block --root -f --no-legend --runtime --fail --no-pager -s --failed --no-reload --signal --force --now --state --full --no-wall --system --global -p -t -h -P --type -H --privileged --version --help --property --host -q
表示まで少し時間はかかるが、サービス名(ユニットファイル名)の途中で「TABキー」を入力すると、一致するサービスの一覧を表示できる。
$ sudo systemctl restart sshd[TAB]キー入力 sshd@ sshd.service sshd-keygen.service sshd.socket
sshの場合
sshでは、~/.ssh/known_hosts
や~/.ssh/config
、/etc/hosts
からホスト名候補を表示できる。
$ ssh [TAB]キー入力 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.5.1.35 ol7srv.dbprivatenrt01s.work01nrtvcn.oraclevcn.com ol7srv
$ ssh ol7[TAB]キー入力 ol7ksplice ol7srv ol7srv2 ol7srv3 ol7srv-vip.dbprivatenrt01s.work01nrtvcn.oraclevcn.com
$ ssh -o [TAB]キー入力 AddressFamily= IdentitiesOnly= BatchMode= IdentityFile= BindAddress= IPQoS= ChallengeResponseAuthentication= KbdInteractive
ここまで来ると何でもありだ。とりあえず「TABキー」を試してみたい。
定義ファイルを解析すれば、コマンドごとに何ができるかわかる。だけれど数が多いので覚えるのはナンセンスだ。
次のように本来オプションを指定するコマンドなのに、カレントディレクトリのファイルやディレクトリが表示されたときは定義されていない、と覚えた方がいいだろう。
$ sudo yum-config-managar [TAB]キー入力 bash-completion-extras-2.1-11.el7.noarch.rpm .bash_history .bash_logout .bash_profile .bashrc .cache/ .config/ .lesshst sample.txt .ssh/
3-5. さらに追加モジュール
bash-completionには追加モジュールのbash-completion-extras
がある。こちらはRHEL7系でもEPELリポジトリが必要だ。
なお、現時点利用できるのはEPEL7だけで、EPEL6とEPEL8では提供されていない。しかし、el7のサフィックスは付いていてもnoarchなので、wgetやyumdownloaderで入手して、RHEL6/8系にインストールすれば使えるだろう。
$ sudo yum list bash-completion-extras Loaded plugins: langpacks, ulninfo Available Packages bash-completion-extras.noarch 1:2.1-11.el7 ol7_developer_EPEL
2.EPELリポジトリがインストールされていないときはインストールする。
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
$ sudo amazon-linux-extras install epel -y
3.bash-completion-extrasパッケージをインストールする。これで終了だ。
$ sudo yum install bash-completion-extras -y
4.パッケージの中身を確認すると300近いモジュールがあり、mysqlやpostgresqlなどもあることがわかる。
$ rpm -ql bash-completion-extras |wc -l 271 $ rpm -ql bash-completion-extras /usr/share/bash-completion/completions /usr/share/bash-completion/completions/a2x /usr/share/bash-completion/completions/aclocal /usr/share/bash-completion/completions/add_members /usr/share/bash-completion/completions/alias /usr/share/bash-completion/completions/alternatives /usr/share/bash-completion/completions/animate /usr/share/bash-completion/completions/ant /usr/share/bash-completion/completions/apropos /usr/share/bash-completion/completions/arch /usr/share/bash-completion/completions/arping ★以下省略