bash ヒストリ活用術 - 過去のコマンドを使い倒す
この記事でできるようになること
historyコマンドで過去のコマンドを一覧・再実行できるCtrl+Rでコマンド履歴をさかのぼり検索できる!!/!$のショートカットで素早く作業できるHISTSIZE/HISTCONTROL設定でヒストリを快適にカスタマイズできる
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 でインクリメンタルサーチ
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)」と衝突することがあります。効かない場合は .bashrc に stty -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 でヒストリを増やす
~/.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 |
ignorespace と ignoredups の両方 |
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
タイムスタンプがあると「あの操作はいつやったか?」という障害調査や作業記録に役立ちます。