Bashを使っていて、こんなディレクトリがあるとします。
$ ls
aaa-bbb-ccc
このディレクトリに移動したいけれど、名前の先頭の aaa ではなく、途中の bbb だけ覚えている。
つい、
cd bbb<TAB>
とやりたくなりますが、通常のBashのTAB補完は基本的に前方一致なので、これでは aaa-bbb-ccc は補完されません。
そこで使えるのがglobです。
cd *bbb*
* は任意の文字列にマッチするので、aaa-bbb-ccc が該当します。
ただ、ここでもう一つ欲が出ます。
cd *bbb*
と入力した時点で、
cd aaa-bbb-ccc/
に展開して確認してから実行したい。
そんなときに便利なのが Alt-g です。
Alt-g:globを使って補完する
Bashのコマンドライン編集を担当しているReadlineには、glob-complete-word という機能があります。
デフォルトでは Alt-g に割り当てられているので、
cd *bbb*
まで入力して Alt-g を押すと、globにマッチする名前を使って補完できます。
たとえば、
$ cd *bbb*<Alt-g>
から、
$ cd aaa-bbb-ccc/
という具合です。
「名前の一部しか覚えていない」という場面でかなり便利です。
通常のTAB補完と使い分けると、
cd aaa<TAB> # 先頭を覚えている
cd *bbb*<Alt-g> # 途中だけ覚えている
という操作ができます。
Ctrl-x *:globをその場で展開する
Alt-g と一緒に覚えておきたいのが、
Ctrl-x *
です。
こちらは glob-expand-word で、globパターンそのものをマッチしたファイル名に展開します。
たとえば、
$ echo *bbb*
と入力して Ctrl-x * を押すと、
$ echo aaa-bbb-ccc
のようになります。
複数マッチする場合には、それらがまとめて展開されます。
感覚的には、
Alt-g → globを使って「補完」
Ctrl-x * → globを使って「展開」
と覚えておくと分かりやすいです。
Alt-.:直前のコマンドの最後の引数を再利用する
個人的にBashを使うなら覚えておきたいショートカットの一つが Alt-. です。
たとえば、
mkdir /tmp/very-long-directory-name
を実行した直後に、
cd <Alt-.>
とすると、
cd /tmp/very-long-directory-name
になります。
つまり、直前のコマンドの最後の引数を挿入してくれます。
ファイルを作ってすぐ開く場合などにも使えます。
touch some-very-long-filename.txt
vim <Alt-.>
Alt-. を繰り返し押せば、さらに古いコマンドの末尾引数を遡ることもできます。
Ctrl-r:コマンド履歴を検索する
これは知っている人も多いと思いますが、Ctrl-r も非常に便利です。
押すと過去のコマンドをインクリメンタル検索できます。
たとえば以前実行した、
docker compose exec app bundle exec rails console
をもう一度使いたい場合、矢印キーで延々と履歴を遡る必要はありません。
Ctrl-r を押して、
rails
などと入力すれば、それを含む履歴を探せます。
長いコマンドを頻繁に再利用するなら必須級です。
Ctrl-x Ctrl-e:入力中のコマンドをエディタで編集する
コマンドが長くなってくると、シェルの1行編集ではつらくなることがあります。
そんなときは、
Ctrl-x Ctrl-e
を押します。
すると現在入力しているコマンドを $EDITOR で編集できます。
たとえば、
find . -type f -name '*.log' -mtime +7 ...
のような長いコマンドを組み立てている途中で、
Ctrl-x Ctrl-e
を押せば、設定されている vim や nano などのエディタで編集できます。
保存して終了すると、その内容がシェルに戻されて実行されます。
複雑なワンライナーではかなり便利です。
その他、覚えておくと便利なReadline操作
BashではEmacs風のReadlineキーバインドがデフォルトで使われています。
よく使うものをまとめると次の通りです。
| キー | 動作 |
|---|---|
Alt-g | globパターンを使って補完 |
Ctrl-x * | globを実際のファイル名に展開 |
Alt-* | 補完候補をまとめて挿入 |
Alt-. | 過去のコマンドの最後の引数を挿入 |
Ctrl-r | コマンド履歴を検索 |
Ctrl-x Ctrl-e | 現在のコマンドをエディタで編集 |
Ctrl-a | 行頭へ移動 |
Ctrl-e | 行末へ移動 |
Alt-b | 1単語戻る |
Alt-f | 1単語進む |
Ctrl-w | カーソルより前の単語を削除 |
Alt-d | カーソルより後ろの単語を削除 |
Ctrl-u | カーソルより前を削除 |
Ctrl-k | カーソルより後ろを削除 |
Ctrl-_ | Undo |
Alt-# | 入力中のコマンドをコメント化して履歴へ入れる |
全部覚える必要はありません。
まずは、
Alt-g
Alt-.
Ctrl-r
Ctrl-x Ctrl-e
Ctrl-x *
あたりを覚えておくだけでも、Bashでの操作がかなり楽になります。
TABをglob補完にすることもできる
ちなみにReadlineの設定を変更すれば、Alt-g の glob-complete-word をTABに割り当てることもできます。
~/.inputrc に、
"\t": glob-complete-word
と設定する方法です。
すると、
cd *bbb*<TAB>
という操作が可能になります。
ただし、これは通常のTAB補完を置き換えてしまいます。
普段の、
cd aaa<TAB>
という操作にも影響するため、個人的にはTABは通常補完のまま残し、
通常の補完 → TAB
glob補完 → Alt-g
と使い分ける方が扱いやすいと思います。
まとめ
今回の発見は単純で、
aaa-bbb-ccc/
というディレクトリに対して、
cd *bbb*
まで入力したら、
Alt-g
を押せばglobを利用した補完ができる、というものです。
Bashには、普段TABと矢印キーだけで操作しているとなかなか気づかないReadlineの機能がかなりあります。
特に、
Alt-g glob補完
Ctrl-x * glob展開
Alt-. 前の引数を再利用
Ctrl-r 履歴検索
Ctrl-x Ctrl-e エディタで編集
の5つは、知っておくと日常的なシェル操作で役立ちます。
Bashの操作を速くしたい場合、コマンドやツールを追加するだけでなく、Readlineのキーバインドを調べてみるのもおすすめです。