bashの強力な機能の1つにコマンド履歴がある。過去に入力したコマンドを手動で入力することなく再利用する方法だ。コマンド入力を高速化する効果的な方法であり、bashを使う場合にはまず使いこなしたい。この機能は、ショートカットキーを使って利用することが多い。今回は、このコマンド履歴機能に関連するショートカットキーについて解説していこう。

コマンド履歴に関するショートカットキー

今回も「bind -p」の出力結果を整理するところから始めよう。bashではデフォルトで次のキーがコマンド履歴に関する機能として設定されていることがわかる。

キー 操作
「Ctrl」+「p」 コマンド履歴から1つ前のコマンドを表示(古いほうへ)
「↑」 コマンド履歴から1つ前のコマンドを表示(古いほうへ)
「Ctrl」+「n」 コマンド履歴から1つ後のコマンドを表示(新しい方へ)
「↓」 コマンド履歴から1つ後のコマンドを表示(新しい方へ)
「ESC」「<」 コマンド履歴の一番古いコマンドを表示
「ESC」「>」 コマンド履歴の一番新しいコマンドを表示
「Ctrl」+「r」 インクリメンタルコマンド履歴検索(古いほうへ)
「Ctrl」+「s」 インクリメンタルコマンド履歴検索(新しいほうへ)
「ESC」「p」 コマンド履歴検索(古いほうへ)
「ESC」「n」 コマンド履歴検索(新しいほうへ)
「ESC」「Tab」 コマンド履歴補完
「ESC」「^」 コマンド履歴展開

上記表は、意味的に3つに分けることができる。また、Windowsでなじみ深いキーだけに絞って整理すると覚えやすくなる。以降で、それぞれ整理していく。

コマンド履歴を行き来するショートカットキー

コマンド履歴を行き来するショートカットキーは次の通りだ。

キー 操作
「↑」 コマンド履歴から1つ前のコマンドを表示(古いほうへ)
「↓」 コマンド履歴から1つ後のコマンドを表示(新しいほうへ)
「ESC」「<」 コマンド履歴の一番古いコマンドを表示
「ESC」「>」 コマンド履歴の一番新しいコマンドを表示

「コマンド履歴」とは、ユーザーが過去に入力したコマンドを記録したもので、次のスクリーンショットのようにhistory組み込みコマンドを実行することでこの「コマンド履歴」の内容を確認することができる。

history組み込みコマンドで「コマンド履歴」を確認

「↑」を1回押すと、コマンド履歴で一番新しいものが表示される。さらに「↑」を押すとその1つ前のコマンドが表示される。このように、「↑」と「↓」はコマンド履歴を行き来して表示するショートカットキーだ。また、「ESC」「<」と「ESC」「>」はコマンド履歴の最初と最後に飛ぶショートカットキーだ。

「↑」と「↓」がコマンド履歴を利用する最も基本的な方法である。「ESC」「<」と「ESC」「>」はそれほど使うことはないかと思う。最近使用したコマンドを採用するなら「↑」と「↓」が特に便利だろう。

コマンド履歴を検索するショートカットキー

「↑」と「↓」によるコマンド履歴の利用は、最近使用したコマンドを再利用する場合には便利だが、古いコマンドを利用する際にはかなり面倒だ。そうした場合には、コマンド履歴から検索することができる次のショートカットキーを利用する。

キー 操作
「Ctrl」+「r」 インクリメンタルコマンド履歴検索(古いほうへ)
「Ctrl」+「s」 インクリメンタルコマンド履歴検索(新しいほうへ)
「ESC」+「p」 コマンド履歴検索(古いほうへ)
「ESC」+「n」 コマンド履歴検索(新しいほうへ)

まず、「Ctrl」+「r」と「Ctrl」+「s」でワンセット、「ESC」+「p」と「ESC」+「n」でワンセットと覚えてほしい。そして「Ctrl」+「r」と「Ctrl」+「s」および「ESC」+「p」と「ESC」+「n」の使い分けだが、「Ctrl」+「r」と「Ctrl」+「s」のほうが柔軟度の高い検索、「ESC」+「p」と「ESC」+「n」は入力したコマンドの先頭の文字列で検索する方法、と覚えておけばよいと思う。入力したコマンドの先頭を覚えているなら「ESC」+「n」と「ESC」+「p」で検索できる。そうではない場合には「Ctrl」+「r」と「Ctrl」+「s」で検索ということになる。

使い方はどちらも似ている。次のような感じだ。

【インクリメンタルコマンド履歴検索の場合】

  1. キーワードを入力
  2. 「Ctrl」+「r」と入力
  3. 「Ctrl」+「r」と「Ctrl」+「s」で行った来たりしながら対象を探す
  4. 「Enter」キーで実行


【コマンド履歴検索の場合】

  1. キーワード(過去に入力した先頭の文字列)を入力
  2. 「ESC」+「p」と入力
  3. 「ESC」+「p」と「ESC」+「n」で行った来たりしながら対象を探す
  4. 「Enter」キーで実行


どの方法を使うかは好みが分かれるところだ。なるべく覚えるショートカットキーを減らしたいのであれば、使用できる範囲が広い「Ctrl」+「r」と「Ctrl」+「s」を覚えておくとよいと思う。

そのほかのコマンド履歴関連ショートカットキー

コマンド履歴関係のショートカットキーとしては後2つ設定されている。しかし、使用頻度で言うと、その2つはそれほど使わないかもしれない。

キー 操作
「ESC」+「Tab」 コマンド履歴補完
「ESC」+「^」 コマンド履歴展開

「ESC」+「Tab」は「ESC」+「p」で順繰りにたどっていって表示されるコマンド候補を一覧で表示する機能、「ESC」+「^」は「!コマンド履歴番号」のように、入力したものを対応するコマンド履歴に置き換える機能だ。

history組み込みコマンドを実行し、grepで絞り込んで使いたいコマンドを見つけた場合などは「!コマンド履歴番号」と入力してから「ESC」+「^」と入力すればその場に該当する履歴が展開される。マウスを使ってコピー&ペーストなどを実施する必要性がなくなるわけだ。ただし、その場合の手間を考えると、マウスを使ってコピー&ペーストしたほうが早いのではないかという気もする。

「ESC」+「Tab」と「ESC」+「^」はそれほど使うことはないかもしれないが、一応こういった機能があるということを覚えておいてもらえればと思う。

付録 お薦めbashショートカットキー

キー 操作
「→」 カーソルを1文字右へ移動
「←」 カーソルを1文字左へ移動
「Home」 カーソルを行頭へ移動
「End」 カーソルを行末へ移動
「Ctrl」+「→」 カーソルを単語の末尾へ移動、すでに単語の末尾の場合は、次の単語の末尾へ移動
「Ctrl」+「←」 カーソルを単語の先頭へ移動、すでに単語の先頭の場合は、前の単語の先頭へ移動
キー 機能
「Backspace」 カーソルの1つ左の文字を削除
「Delete」 カーソルのある場所の文字を削除
「Ctrl」+「Backspace」 カーソルの1つ左の文字から単語頭までを削除
「Ctrl」+「Delete」 カーソルから単語末までを削除
「Ctrl」+「Home」 カーソルの1つ左の文字から行頭までを削除
「Ctrl」+「End」 カーソルから行末までを削除

上記操作に操作に必要な設定

"\C-h": backward-kill-word  # Ctrl-Backspace
"\e[1;5H": unix-line-discard    # Ctrl-Home
"\e[1;5F": kill-line        # Ctrl-End
キー 機能
「Backspace」 カーソルの1つ左の文字を削除
「Delete」 カーソルのある場所の文字を削除
「ESC」+「Backspace」 カーソルの1つ左の文字から単語頭までを削除
「ESC」+「Delete」 カーソルから単語末までを削除
「Ctrl」+「u」 カーソルの1つ左の文字から行頭までを削除
「Ctrl」+「k」 カーソルから行末までを削除

上記操作に操作に必要な設定

"\e\e[3~": kill-word        # ESC Delete
キー 操作
「↑」 コマンド履歴から1つ前のコマンドを表示(古いほうへ)
「↓」 コマンド履歴から1つ後のコマンドを表示(新しいほうへ)
「Ctrl」+「r」 インクリメンタルコマンド履歴検索(古いほうへ)
「Ctrl」+「s」 インクリメンタルコマンド履歴検索(新しいほうへ)

付録 Windows Terminal キーとキー表記

キー キー表記
「ESC」 \e
「ESC」+「ESC」 \e\e
「Home」 \e[H
「Insert」 \e[2~
「Delete」 \e[3~
「End」 \e[F
「Page Up」 \e[5~
「Page Down」 \e[6~
「F1」 \eOP
「F2」 \eOQ
「F3」 \eOR
「F4」 \eOS
「F5」 \eO15~
「F6」 \eO17~
「F7」 \eO18~
「F8」 \eO19~
「F9」 \eO20~
「F10」 \eO21~
「Alt」+「Home」 \e[1;3H
「Alt」+「Insert」 \e[2;3~
「Alt」+「Delete」 \e[3;3~
「Alt」+「End」 \e[1;3F
「Alt」+「Page Up」 \e[5;3~
「Alt」+「Page Down」 \e[6;3~
「Ctrl」+「Home」 \e[1;5H
「Ctrl」+「Insert」 \e[2;5~
「Ctrl」+「Delete」 \e[3;5~
「Ctrl」+「End」 \e[1;5F
「Ctrl」+「Page Up」 \e[5;5~
「Ctrl」+「Page Down」 \e[6;5~
「↑」 \e[A
「↓」 \e[B
「→」 \e[C
「←」 \e[D
「Alt」+「↑」 \e[1;3A
「Alt」+「↓」 \e[1;3B
「Alt」+「→」 \e[1;3C
「Alt」+「←」 \e[1;3D
「Ctrl」+「↑」 \e[1;5A
「Ctrl」+「↓」 \e[1;5B
「Ctrl」+「→」 \e[1;5C
「Ctrl」+「←」 \e[1;5D
貼り付け開始 \e[200~
クエリステータスレポート \e[5n
クエリステータスレポート(応答) \e[0n
「Backspace」 \C-?
「Ctrl」+「Backspace」 \C-H
「Tab」 \C-I
「Enter」 \C-M

付録 Mac Terminal キーとキー表記

キー キー表記
「ESC」 \e
「ESC」+「ESC」 \e\e
「Home」 なし
「Insert」 なし
「Delete」 \e[3~
「End」 なし
「Page Up」 なし
「Page Down」 なし
「F1」 \eOP
「F2」 \eOQ
「F3」 \eOR
「F4」 \eOS
「F5」 \eO15~
「F6」 \eO17~
「F7」 \eO18~
「F8」 \eO19~
「F9」 \eO20~
「F10」 なし
「F11」 \eO23~
「F12」 \eO24~
「Alt」+「Home」 なし
「Alt」+「Insert」 なし
「Alt」+「Delete」 なし
「Alt」+「End」 なし
「Alt」+「Page Up」 なし
「Alt」+「Page Down」 なし
「Ctrl」+「Home」 なし
「Ctrl」+「Insert」 なし
「Ctrl」+「Delete」 \e[3;5~
「Ctrl」+「End」 なし
「Ctrl」+「Page Up」 なし
「Ctrl」+「Page Down」 なし
「↑」 \e[A
「↓」 \e[B
「→」 \e[C
「←」 \e[D
「Alt」+「↑」 なし
「Alt」+「↓」 なし
「Alt」+「→」 なし
「Alt」+「←」 なし
「Ctrl」+「↑」 \e[A
「Ctrl」+「↓」 \e[B
「Ctrl」+「→」 \e[1;5C
「Ctrl」+「←」 \e[1;5D
貼り付け開始 \e[200~
クエリステータスレポート \e[5n
クエリステータスレポート(応答) \e[0n
「Backspace」 \C-H
「Ctrl」+「Backspace」 \C-H
「Tab」 \C-I
「Enter」 \C-M

付録 bash bind -p 出力キー対応表

キー表記 キー readline関数(Ubuntu 20.04デフォルト割当)
\e 「ESC」 set-mark
\C-g 「Ctrl」+「g」 abort
\C-x\C-g 「Ctrl」+「x」+「Ctrl」+「g」 abort
\e\C-g 「ESC」+「Ctrl」+「g」 abort
\C-j 「Enter」 accept-line
\C-m 「Enter」 accept-line
\C-b 「Ctrl」+「b」 backward-char
\eOD 「←」 backward-char
\e[D 「←」 backward-char
\C-? 「Backspace」 backward-delete-char
\C-h 「Ctrl」+「Backspace」 backward-delete-char
\C-x\C-? 「Ctrl」+「x」+「Ctrl」+「Backspace」 backward-kill-line
\e\C-? 「ESC」+「Ctrl」+「Backspace」 backward-kill-word
\e\C-h 「ESC」+「Backspace」 backward-kill-word
\e[1;3D 「Alt」+「←」 backward-word
\e[1;5D 「Ctrl」+「←」 backward-word
\e[5D 「Ctrl」+「←」 backward-word
\e\e[D 「ESC」+「←」 backward-word
\eb 「ESC」+「b」 backward-word
\e< 「ESC」+「<」 beginning-of-history
\C-a 「Ctrl」+「a」 beginning-of-line
\eOH 「Home」 beginning-of-line
\e[1~ 「Home」 beginning-of-line
\e[H 「Home」 beginning-of-line
\e[200~ 貼り付け開始 bracketed-paste-begin
\C-xe 「Ctrl」+「x」+「e」 call-last-kbd-macro
\C-] 「Ctrl」+「]」 character-search
\e\C-] 「ESC」+「Ctrl」+「]」 character-search-backward
\C-l 「Ctrl」+「l」 clear-screen
\C-i 「Tab」 complete
\e\e 「ESC」+「ESC」 complete
\e! 「ESC」+「!」 complete-command
\e/ 「ESC」+「/」 complete-filename
\e@ 「ESC」+「@」 complete-hostname
\e{ 「ESC」+「{」 complete-into-braces
\e~ 「ESC」+「~」 complete-username
\e$ 「ESC」+「$」 complete-variable
\C-d 「Ctrl」+「d」 delete-char
\e[3~ 「Delete」 delete-char
\e\ 「ESC」+「\」 delete-horizontal-space
\e- 「ESC」+「-」 digit-argument
\e0 「ESC」+「0」 digit-argument
\e1 「ESC」+「1」 digit-argument
\e2 「ESC」+「2」 digit-argument
\e3 「ESC」+「3」 digit-argument
\e4 「ESC」+「4」 digit-argument
\e5 「ESC」+「5」 digit-argument
\e6 「ESC」+「6」 digit-argument
\e7 「ESC」+「7」 digit-argument
\e8 「ESC」+「8」 digit-argument
\e9 「ESC」+「9」 digit-argument
\C-x\C-v 「Ctrl」+「x」+「Ctrl」+「v」 display-shell-version
\C-xA 「Ctrl」+「x」+「A」 do-lowercase-version
\C-xB 「Ctrl」+「x」+「B」 do-lowercase-version
\C-xC 「Ctrl」+「x」+「C」 do-lowercase-version
\C-xD 「Ctrl」+「x」+「D」 do-lowercase-version
\C-xE 「Ctrl」+「x」+「E」 do-lowercase-version
\C-xF 「Ctrl」+「x」+「F」 do-lowercase-version
\C-xG 「Ctrl」+「x」+「G」 do-lowercase-version
\C-xH 「Ctrl」+「x」+「H」 do-lowercase-version
\C-xI 「Ctrl」+「x」+「I」 do-lowercase-version
\C-xJ 「Ctrl」+「x」+「J」 do-lowercase-version
\C-xK 「Ctrl」+「x」+「K」 do-lowercase-version
\C-xL 「Ctrl」+「x」+「L」 do-lowercase-version
\C-xM 「Ctrl」+「x」+「M」 do-lowercase-version
\C-xN 「Ctrl」+「x」+「N」 do-lowercase-version
\C-xO 「Ctrl」+「x」+「O」 do-lowercase-version
\C-xP 「Ctrl」+「x」+「P」 do-lowercase-version
\C-xQ 「Ctrl」+「x」+「Q」 do-lowercase-version
\C-xR 「Ctrl」+「x」+「R」 do-lowercase-version
\C-xS 「Ctrl」+「x」+「S」 do-lowercase-version
\C-xT 「Ctrl」+「x」+「T」 do-lowercase-version
\C-xU 「Ctrl」+「x」+「U」 do-lowercase-version
\C-xV 「Ctrl」+「x」+「V」 do-lowercase-version
\C-xW 「Ctrl」+「x」+「W」 do-lowercase-version
\C-xX 「Ctrl」+「x」+「X」 do-lowercase-version
\C-xY 「Ctrl」+「x」+「Y」 do-lowercase-version
\C-xZ 「Ctrl」+「x」+「Z」 do-lowercase-version
\eA 「ESC」+「A」 do-lowercase-version
\eB 「ESC」+「B」 do-lowercase-version
\eC 「ESC」+「C」 do-lowercase-version
\eD 「ESC」+「D」 do-lowercase-version
\eE 「ESC」+「E」 do-lowercase-version
\eF 「ESC」+「F」 do-lowercase-version
\eG 「ESC」+「G」 do-lowercase-version
\eH 「ESC」+「H」 do-lowercase-version
\eI 「ESC」+「I」 do-lowercase-version
\eJ 「ESC」+「J」 do-lowercase-version
\eK 「ESC」+「K」 do-lowercase-version
\eL 「ESC」+「L」 do-lowercase-version
\eM 「ESC」+「M」 do-lowercase-version
\eN 「ESC」+「N」 do-lowercase-version
\eO 「ESC」+「O」 do-lowercase-version
\eP 「ESC」+「P」 do-lowercase-version
\eQ 「ESC」+「Q」 do-lowercase-version
\eR 「ESC」+「R」 do-lowercase-version
\eS 「ESC」+「S」 do-lowercase-version
\eT 「ESC」+「T」 do-lowercase-version
\eU 「ESC」+「U」 do-lowercase-version
\eV 「ESC」+「V」 do-lowercase-version
\eW 「ESC」+「W」 do-lowercase-version
\eX 「ESC」+「X」 do-lowercase-version
\eY 「ESC」+「Y」 do-lowercase-version
\eZ 「ESC」+「Z」 do-lowercase-version
\el 「ESC」+「l」 downcase-word
\e\C-i 「ESC」+「Tab」 dynamic-complete-history
\C-x\C-e 「Ctrl」+「x」+「Ctrl」+「e」 edit-and-execute-command
\C-x) 「Ctrl」+「x」+「)」 end-kbd-macro
\e> 「ESC」+「>」 end-of-history
\C-e 「Ctrl」+「e」 end-of-line
\eOF 「End」 end-of-line
\e[4~ 「End」 end-of-line
\e[F 「End」 end-of-line
\C-x\C-x 「Ctrl」+「x」+「Ctrl」+「x」 exchange-point-and-mark
\C-f 「Ctrl」+「f」 forward-char
\eOC 「→」 forward-char
\e[C 「→」 forward-char
\C-s 「Ctrl」+「s」 forward-search-history
\e[1;3C 「Alt」+「→」 forward-word
\e[1;5C 「Ctrl」+「→」 forward-word
\e[5C 「Ctrl」+「→」 forward-word
\e\e[C 「ESC」+「→」 forward-word
\ef 「ESC」+「f」 forward-word
\eg 「ESC」+「g」 glob-complete-word
\C-x* 「Ctrl」+「x」+「*」 glob-expand-word
\C-xg 「Ctrl」+「x」+「g」 glob-list-expansions
\e^ 「ESC」+「^」 history-expand-line
\e# 「ESC」+「#」 insert-comment
\e* 「ESC」+「*」 insert-completions
\e. 「ESC」+「.」 insert-last-argument
\e_ 「ESC」+「_」 insert-last-argument
\C-k 「Ctrl」+「k」 kill-line
\e[3;5~ 「Ctrl」+「Delete」 kill-word
\ed 「ESC」+「d」 kill-word
\C-n 「Ctrl」+「n」 next-history
\eOB 「↓」 next-history
\e[B 「↓」 next-history
\en 「ESC」+「n」 non-incremental-forward-search-history
\ep 「ESC」+「p」 non-incremental-reverse-search-history
\C-o 「Ctrl」+「o」 operate-and-get-next
\C-x! 「Ctrl」+「x」+「!」 possible-command-completions
\e= 「ESC」+「=」 possible-completions
\e? 「ESC」+「?」 possible-completions
\C-x/ 「Ctrl」+「x」+「/」 possible-filename-completions
\C-x@ 「Ctrl」+「x」+「@」 possible-hostname-completions
\C-x~ 「Ctrl」+「x」+「~」 possible-username-completions
\C-x$ 「Ctrl」+「x」+「$」 possible-variable-completions
\C-p 「Ctrl」+「p」 previous-history
\eOA 「↑」 previous-history
\e[A 「↑」 previous-history
\C-p 「Ctrl」+「q」 quoted-insert
\C-v 「Ctrl」+「v」 quoted-insert
\e[2~ 「Insert」 quoted-insert
\C-x\C-r 「Ctrl」+「x」+「Ctrl」+「r」 re-read-init-file
\e[0n クエリステータスレポート(応答) redraw-current-line
\er 「ESC」+「r」 redraw-current-line
\C-r 「Ctrl」+「r」 reverse-search-history
\e\C-r 「ESC」+「Ctrl」+「r」 revert-line
\C-@ 「Ctrl」+「@」 set-mark
\e\C-e 「ESC」+「Ctrl」+「e」 shell-expand-line
\C-x( 「Ctrl」+「x」+「(」 start-kbd-macro
\e& 「ESC」+「&」 tilde-expand
\et 「ESC」+「t」 transpose-words
\C-_ 「Ctrl」+「_」 undo
\C-x\C-u 「Ctrl」+「x」+「Ctrl」+「u」 undo
\C-u 「Ctrl」+「u」 unix-line-discard
\C-w 「Ctrl」+「w」 unix-word-rubout
\eu 「ESC」+「u」 upcase-word
\C-z 「Ctrl」+「z」 vi-editing-mode
\C-y 「Ctrl」+「y」 yank
\e. 「ESC」+「.」 yank-last-arg
\e_ 「ESC」+「_」 yank-last-arg
\e\C-y 「ESC」+「Ctrl」+「y」 yank-nth-arg
\ey 「ESC」+「y」 yank-pop