bash ヒストリ活用術 - 過去のコマンドを使い倒す

bash ヒストリ活用術 - 過去のコマンドを使い倒す

この記事でできるようになること

  • history コマンドで過去のコマンドを一覧・再実行できる
  • Ctrl+R でコマンド履歴をさかのぼり検索できる
  • !! / !$ のショートカットで素早く作業できる
  • HISTSIZE / HISTCONTROL 設定でヒストリを快適にカスタマイズできる
リナ: ライニー先輩!さっき長いコマンドを打ったのに、また最初から打ち直さないといけないんですか?
ライニー先輩: それはつらいね。実は bash には「コマンド履歴(ヒストリ)」機能があって、過去に打ったコマンドをサクサク呼び出せるんだよ。

1. history コマンドで履歴を確認する

リナ: コマンド履歴って、どうやって見るんですか?
ライニー先輩: history コマンドを打つと、過去に実行したコマンドが番号付きで一覧表示されるよ。
$ history
  498  ls -la /var/log
  499  sudo apt update
  500  grep -r "error" /var/log/syslog
  501  cd /home/ubuntu
  502  history

左の番号は「履歴番号」といって、後で特定のコマンドを再実行するときに使えます。

特定のコマンドだけ絞り込む

$ history | grep apt
  499  sudo apt update
  485  sudo apt install vim
  470  apt search nginx

history の出力を grep でフィルタリングすると、目的のコマンドをすぐに見つけられます。

直近 N 件だけ表示する

$ history 10

引数に数字を指定すると、最新 N 件だけ表示されます。

2. 矢印キーでコマンドをたどる

リナ: 一番簡単な呼び出し方って何ですか?
ライニー先輩: キーボードの上矢印キー(↑)を押すだけ。一個前のコマンドが出てくるよ。
キー操作 動作
一つ前のコマンドに移動
一つ後のコマンドに移動
Enter 現在のコマンドを実行
Ctrl+A 行頭に移動
Ctrl+E 行末に移動

矢印キーでさかのぼりすぎたら で戻れます。Ctrl+C で入力をキャンセルして元の状態に戻せます。

3. Ctrl+R でインクリメンタルサーチ

リナ: でも 100 個以上前のコマンドを矢印キーで探すのは大変ですよね...。
ライニー先輩: そのときは Ctrl+R が最強だよ。検索キーワードを入力するだけで、過去のコマンドをリアルタイムで探してくれるんだ。

Ctrl+R を押すと、プロンプトが次のように変わります:

(reverse-i-search)`':

ここでキーワードを入力すると、一致するコマンドがリアルタイムで表示されます:

(reverse-i-search)`apt': sudo apt update

Ctrl+R の操作まとめ

キー操作 動作
Ctrl+R 逆方向検索を開始(押すたびにさらに古い一致へ)
Ctrl+S 順方向検索(端末設定によっては使えないことがある)
Enter 表示されているコマンドを実行
/ 表示されているコマンドを編集モードに入る
Ctrl+G 検索をキャンセルして元のプロンプトに戻る

Ctrl+S はターミナルの「フロー制御(XON/XOFF)」と衝突することがあります。効かない場合は .bashrcstty -ixon を追加してください。

4. ヒストリ展開:!! と !$ を使いこなす

リナ: !! って何ですか?たまに見かけるんですが。
ライニー先輩: !! は「直前に実行したコマンド全体」を表す特別な記法だよ。例えば sudo を付け忘れたときにとても便利!

!! — 直前のコマンドを再実行

$ apt update
E: Could not open lock file /var/lib/dpkg/lock-frontend...

$ sudo !!
sudo apt update

sudo !! と打つと、自動的に sudo apt update として再実行されます。

!! を実行すると、展開後のコマンドが一度表示されてから実行されます。何が実行されるか確認できるので安心です。

!$ — 直前コマンドの最後の引数

$ mkdir -p /var/log/myapp
$ cd !$
cd /var/log/myapp

!$ は直前のコマンドの「最後の引数」を表します。長いパスを再度タイプしなくて済みます。

!^ — 直前コマンドの最初の引数

$ diff file1.txt file2.txt
$ vim !^
vim file1.txt

!^ は直前のコマンドの「最初の引数」を表します。

!n — 履歴番号で実行

$ history | grep grep
  500  grep -r "error" /var/log/syslog

$ !500
grep -r "error" /var/log/syslog

! のあとに履歴番号を入力すると、そのコマンドを再実行できます。

ヒストリ展開は確認なしに即実行されます。rm -rf 系のコマンドを !! で再実行するときは特に慎重に。

5. HISTSIZE と HISTFILESIZE でヒストリを増やす

リナ: デフォルトだと履歴はどのくらい保存されるんですか?
ライニー先輩: 多くの環境でデフォルトは 1000 件程度だけど、設定で増やせるよ。長く使うマシンでは増やしておくと便利。

~/.bashrc に以下を追記します:

HISTSIZE=10000        # メモリ上に保持する件数(現在のセッション中)
HISTFILESIZE=20000    # ~/.bash_history ファイルに保存する件数

設定後は source ~/.bashrc で反映します。

$ source ~/.bashrc

~/.bash_history ファイルとは

bash を終了すると、セッション中のコマンドが ~/.bash_history に書き込まれます。HISTFILESIZE がこのファイルの最大行数を制御します。

$ cat ~/.bash_history | wc -l
1247

6. HISTCONTROL で履歴をクリーンに保つ

リナ: 同じコマンドを何度も打つと履歴が重複してしまうのが嫌なんですが...。
ライニー先輩: HISTCONTROL の設定で解決できるよ!
# ~/.bashrc に追記
HISTCONTROL=ignoreboth
動作
ignorespace スペースで始まるコマンドを履歴に記録しない
ignoredups 直前と同じコマンドの連続重複を記録しない
ignoreboth ignorespaceignoredups の両方
erasedups 履歴全体から重複をすべて削除

スペースで始めると履歴に残らない

$  secret-command --password=mypassword

先頭にスペースを付けると(HISTCONTROL=ignorespace または ignoreboth の設定時)、履歴に記録されません。コマンドラインでパスワードを入力せざるを得ないときのテクニックです。

7. HISTTIMEFORMAT でタイムスタンプを記録する

リナ: あのコマンド、いつ打ったっけって調べたいときはどうすればいいですか?
ライニー先輩: HISTTIMEFORMAT を設定すると、履歴にタイムスタンプが付くよ。障害対応の証跡にもなって便利。
# ~/.bashrc に追記
HISTTIMEFORMAT="%Y-%m-%d %T "
$ history 5
  998  2026-06-01 10:23:45 ls -la
  999  2026-06-01 10:24:12 cd /var/log
 1000  2026-06-01 10:25:30 sudo apt update
 1001  2026-06-01 10:26:01 tail -f /var/log/syslog
 1002  2026-06-01 10:28:44 history 5

タイムスタンプがあると「あの操作はいつやったか?」という障害調査や作業記録に役立ちます。

次に読む