「さっき打った長いコマンドをもう一度使いたいのに、思い出せない」
Linuxでの作業中、こうした場面は日常的に起こります。
この記事では、Linuxの
history コマンドを使ってコマンド履歴を表示・検索・削除する実践的な方法を解説します。基本的な履歴表示だけでなく、実行日時の表示(HISTTIMEFORMAT)、履歴の検索(Ctrl+R)、重複排除(HISTCONTROL)、セキュリティ対策まで、現場で役立つテクニックをまとめました。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
historyコマンドとは? コマンド履歴の仕組み
history コマンドは、bashシェルで過去に実行したコマンドの一覧を表示するコマンドです。実行したコマンドは、セッション中はメモリ上に保持され、ログアウト時にホームディレクトリの
~/.bash_history ファイルに書き出されます。デフォルトでは直近1000件の履歴が保存されます。この件数は環境変数
HISTSIZE(メモリ上の保持数)と HISTFILESIZE(ファイルの保存数)で変更できます。基本的な使い方
1. コマンド履歴を一覧表示する
引数なしで実行すると、履歴番号付きで全履歴が表示されます。# 全履歴を表示 $ history 1 cd /var/log 2 ls -la 3 tail -f messages 4 grep "ERROR" messages
# 直近10件の履歴を表示 $ history 10
2. 履歴番号を指定してコマンドを再実行する(!番号)
history で表示された履歴番号を使って、過去のコマンドをそのまま再実行できます。# 履歴番号42のコマンドを再実行 $ !42
3. 直前のコマンドを再実行する(!!)
!! と入力すると、直前に実行したコマンドをそのまま再実行します。よく使うのが、sudoを付け忘れた時の「
sudo !!」です。# Permission denied になった直後に $ sudo !! # → 直前のコマンドにsudoを付けて再実行される
4. 文字列で始まるコマンドを再実行する(!文字列)
! に続けて文字列を入力すると、その文字列で始まる直近のコマンドを再実行します。# "grep" で始まる直近のコマンドを再実行 $ !grep
5. 文字列を含むコマンドを再実行する(!?文字列)
!? に続けて文字列を入力すると、その文字列を含む直近のコマンドを再実行します。# "messages" を含む直近のコマンドを再実行 $ !?messages
履歴をインクリメンタル検索する(Ctrl+R)
現場で最も使用頻度が高いのが、Ctrl+R によるインクリメンタル逆方向検索です。Ctrl+R を押すと、プロンプトが以下のように変わります。(reverse-i-search)`':
・Ctrl+R を連続で押す:さらに古い候補に移動
・Enter:表示されているコマンドをそのまま実行
・Esc または Ctrl+C:検索を中止してプロンプトに戻る
・右キー(Ctrl+F):表示されているコマンドを編集してから実行
長いコマンドを何度も手入力する必要がなくなるため、作業効率が大幅に上がります。
履歴に実行日時を表示する(HISTTIMEFORMAT)
デフォルトでは履歴に日時情報はありません。「このコマンドをいつ実行したか」を確認するには、環境変数HISTTIMEFORMAT を設定します。# 実行日時を「年-月-日 時:分:秒」形式で表示する $ export HISTTIMEFORMAT='%F %T ' $ history 1 2026-03-15 10:30:00 cd /var/log 2 2026-03-15 10:30:05 ls -la 3 2026-03-15 10:31:20 tail -f messages
※設定前に実行したコマンドには日時が記録されていないため、設定した時点の日時が一律で表示されます。
履歴の動作を制御する環境変数
1. HISTCONTROL ~ 重複や空白コマンドを制御する
HISTCONTROL を設定すると、履歴に記録するコマンドを制御できます。・ignoredups:直前と同じコマンドを履歴に残さない
・ignorespace:先頭にスペースを付けたコマンドを履歴に残さない
・ignoreboth:ignoredups と ignorespace の両方を有効にする
・erasedups:履歴全体から重複を削除し、最新の1件だけ残す
# 直前と重複するコマンド+先頭スペースのコマンドを履歴に残さない $ export HISTCONTROL=ignoreboth
ignorespace を設定しておくと、パスワードを含むコマンドを一時的に履歴に残さないようにできます。先頭にスペースを1つ付けて実行するだけです。# 先頭にスペースを付けると履歴に残らない(HISTCONTROL=ignorespace設定時) $ mysql -u root -pMySecret123
2. HISTIGNORE ~ 特定のコマンドを履歴に記録しない
HISTIGNORE を設定すると、指定したパターンに一致するコマンドを履歴に記録しなくなります。コロン(:)で区切って複数指定できます。# ls、pwd、history を履歴に記録しない $ export HISTIGNORE="ls:pwd:history"
3. HISTSIZE と HISTFILESIZE ~ 履歴の保存件数を変更する
・HISTSIZE:メモリ上に保持する履歴の件数(デフォルト1000)・HISTFILESIZE:
~/.bash_history ファイルに保存する行数(デフォルト1000)# 履歴を5000件に増やす $ export HISTSIZE=5000 $ export HISTFILESIZE=5000
履歴を削除する
1. 全履歴を削除する(history -c)
メモリ上の全履歴を削除します。ただし~/.bash_history ファイルの中身は残るため、完全に消すには history -w でファイルへ書き出す必要があります。# メモリ上の履歴を全削除し、空の状態でファイルに上書き $ history -c $ history -w
2. 特定の履歴番号を削除する(history -d)
パスワードを含むコマンドを誤って実行してしまった場合、その行だけを削除できます。# 履歴番号42を削除する $ history -d 42
3. 履歴をファイルに書き出す / ファイルから読み込む
・history -w:現在のメモリ上の履歴を~/.bash_history に書き出す・history -r:
~/.bash_history の内容をメモリに読み込む・history -a:現在のセッションで新たに実行したコマンドだけを
~/.bash_history に追記する# 現在の履歴をファイルに保存 $ history -w # ファイルから履歴を読み込む $ history -r
複数ターミナルでの履歴の扱い
bashでは、複数のターミナル(SSH接続を含む)を同時に開いている場合、最後に閉じたターミナルの履歴が~/.bash_history を上書きします。つまり、他のターミナルで実行したコマンドが消えてしまう可能性があります。これを防ぐには、以下の2つの設定を組み合わせます。
# ~/.bashrc に追記 # 履歴をファイルに「上書き」ではなく「追記」するモードに変更 shopt -s histappend # コマンド実行のたびに履歴をファイルに追記し、他ターミナルの履歴も読み込む PROMPT_COMMAND="history -a; history -c; history -r"
shopt -s histappend だけだとログアウト時にまとめて追記されるだけですが、PROMPT_COMMAND と組み合わせることで、コマンドを実行するたびにリアルタイムで履歴が共有されます。セキュリティ対策 ~ 履歴を残さない設定
サーバーの用途によっては、コマンド履歴をセキュリティリスクと判断して無効化するケースがあります。1. 履歴機能を完全に無効化する
# ~/.bashrc に追記(このユーザーの履歴を無効化) export HISTSIZE=0
HISTSIZE=0 を設定すると、そのセッションでは一切履歴が保存されなくなります。全ユーザーに適用する場合は
/etc/profile に記述します。# /etc/profile に追記(全ユーザーの履歴を無効化) export HISTSIZE=0
2. 履歴ファイルの保存先を変更する
HISTFILE 環境変数で、履歴ファイルの保存先を変更できます。# 履歴ファイルの保存先を変更する $ export HISTFILE=~/.my_history
HISTFILE=/dev/null に設定すれば、履歴がファイルに一切書き出されなくなります。.bashrcでの永続化設定
ここまで紹介した環境変数の設定は、ターミナルを閉じるとリセットされます。永続化するには~/.bashrc に記述します。# ~/.bashrc に追記する推奨設定 # 履歴の保存件数を増やす export HISTSIZE=5000 export HISTFILESIZE=5000 # 実行日時を記録する export HISTTIMEFORMAT='%F %T ' # 直前と重複するコマンド・先頭スペースのコマンドを履歴に残さない export HISTCONTROL=ignoreboth # ls、pwd、history自体を履歴に残さない export HISTIGNORE="ls:pwd:history" # 複数ターミナルの履歴を統合する shopt -s histappend PROMPT_COMMAND="history -a; history -c; history -r"
$ source ~/.bashrc
「Permission denied」で.bash_historyに書き込めない場合
履歴が保存されない場合、~/.bash_history のパーミッションまたは所有者が変わっている可能性があります。# パーミッションと所有者を確認 $ ls -la ~/.bash_history -rw------- 1 user user 12345 Mar 15 10:00 /home/user/.bash_history # パーミッションを修正する場合 $ chmod 600 ~/.bash_history # 所有者を修正する場合(rootで実行) $ chown user:user ~/.bash_history
sudo su で一時的にrootになった際に ~/.bash_history の所有者がrootに変わってしまうケースです。一般ユーザーに戻った後、履歴が書き込めなくなります。本記事のまとめ
| やりたいこと | コマンド / 設定 |
|---|---|
| コマンド履歴を表示する | history |
| 直近N件の履歴を表示する | history 10 |
| 履歴番号を指定して再実行する | !42 |
| 直前のコマンドを再実行する | !! |
| 文字列で始まるコマンドを再実行する | !grep |
| 履歴をインクリメンタル検索する | Ctrl+R |
| 実行日時を表示する | export HISTTIMEFORMAT='%F %T ' |
| 重複コマンドを履歴に残さない | export HISTCONTROL=ignoreboth |
| 特定の履歴を削除する | history -d 42 |
| 全履歴を削除する | history -c |
| 履歴をファイルに書き出す | history -w |
| 複数ターミナルで履歴を共有する | shopt -s histappend + PROMPT_COMMAND |
| 履歴機能を無効化する | export HISTSIZE=0 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
