「あれ…?さっき実行した、あのすっごく長いコマンド、何だっけ!?」
「1時間前に設定変更したコマンドを、もう一度使いたいんだけど!」
「昨日の夜、一体どんな操作をしたか、正確に思い出せない…😓」
LinuxサーバーをCUI(コマンドライン)で操作していると、誰もがこんな経験をするはずです。
一度入力したコマンド、特に複雑なオプションを付けた長いコマンドを、もう一度キーボードで打ち直すのって、すっごく面倒で非効率的ですよね。
もしあなたが今、こんな風に「linux コマンド 履歴」をうまく使いこなせなくて、ターミナル操作の効率が上がらない…って悩んでいるなら、この記事があなたの疑問をすべて解決します!
Linuxのシェル(Bashとか)には、あなたが過去に入力したコマンドをぜーんぶ記憶してくれる、すっごく強力な「history(履歴)」機能が標準で搭載されてるんです。
これは、単に過去のコマンドを一覧表示するだけの単純な機能じゃありません。
history コマンドは、過去のコマンドを「検索」して、「再実行」して、「削除」して、さらには「自分好みにカスタマイズ」することができる、ターミナル操作を劇的に効率化するための必須ツールなんですよ!
そう、history を制する者が、ターミナル操作を制するんです!
「あのコマンド何だっけ?」っていうストレスから、もう解放されちゃいましょう!
この記事は、そんな「コマンド履歴、わけわかんない!」地獄に陥ってしまったあなたを救うための、安全な対処法をステップバイステップで徹底的に解説する「完全ガイド」です🕵️♀️✨
history コマンドの基本的な使い方から、プロが使ってる高度な検索・再実行(Ctrl+R や !)、安全な削除方法、さらには履歴を最強にカスタマイズする「プロ設定」まで。
私と一緒に、一つずつ冷静に確認していきましょうね🥰
history コマンドとは? – Linuxが操作を記憶する仕組み
history コマンドは、シェル(多くのLinuxディストリビューションで標準の Bash)に組み込まれた「ビルトインコマンド」っていう、最初から用意されてる機能なんです。
私たちがターミナルで実行したコマンドは、ログアウトする時に、ホームディレクトリにある隠しファイル(デフォルトでは ~/.bash_history)に保存されます。
そして、次にログインしたとき、シェルはこの履歴ファイルを読み込んで、過去のコマンドをメモリ上に「おーい、出番だぞー」って展開します。
history コマンドは、このメモリ上に今ロードされているコマンド履歴にアクセスするための「窓口」なんですね。
history コマンドの基本的な使い方
history コマンドの最も基本的な使い方は、引数なしで実行することです。
history – すべての履歴を表示する
ターミナルで history って入力してEnterキーを押すだけ!カンタンですよね。
[user@server ~]$ history 1 ls -l 2 pwd 3 cd /var/log 4 sudo tail -f messages ... 501 ls -F 502 mkdir -p temp/test 503 vi ~/.bashrc 504 source ~/.bashrc 505 history
出力結果の左側にある数字が「履歴番号(ヒストリ番号)」です。
この番号は、後で履歴を再実行したり、削除したりする時にすっごく重要になるので、覚えておいてくださいね。
history [数値] – 直近N件の履歴を表示する
history を引数なしで実行すると、メモリ上に保存されているすべての履歴(デフォルトだと500件や1000件とか)が表示されて、画面が一気に流れちゃいますよね。
「直近のコマンドだけ確認したいんだよ!」っていう場合は、history の後に数値を指定します。
# 直近5件のコマンド履歴だけを表示 [user@server ~]$ history 5 501 ls -F 502 mkdir -p temp/test 503 vi ~/.bashrc 504 source ~/.bashrc 505 history
【最重要】コマンド履歴の「検索」と「再実行」テクニック
history コマンドは、ただ一覧をぼーっと眺めるためだけのものではありません!
「linux コマンド 履歴」を本当に効率化するのは、ここから解説する「検索」と「再実行」のテクニックです。これ、本当に大事ですよ!
方法1: history | grep [キーワード] (王道)
history コマンドの出力を、パイプ(|)っていう記号を使って grep コマンド(文字列検索コマンド)に渡す方法です。
これは、特定のキーワードを含むコマンドを探す時の、最も基本的で確実な方法ですね。
実行例: vi を使ったコマンド履歴だけを検索する
[user@server ~]$ history | grep "vi" 450 vi /etc/hosts 488 sudo vi /etc/nginx/nginx.conf 503 vi ~/.bashrc 507 history | grep "vi"
history の出力結果(500行以上!)が grep にリレーのバトンみたいに渡されて、grep が「vi」っていう文字列を含む行だけを絞り込んで表示してくれました。
左側に履歴番号(450, 488…)がちゃんと表示されてるのがポイントですよ。
便利な grep オプション
- -i (ignore case)
grep -i “VI” みたいに指定すると、大文字と小文字を区別しないで検索します(vi, VI, Vi とか、ぜんぶに一致します!)。 - -v (invert match)
history | grep -v “grep” みたいに指定すると、「grep」っていう文字列自体を含まない行だけを表示できます。(検索結果から「今やった検索のコマンド」自体を除外したい時に便利ですよね!)
方法2: Ctrl+R (インクリメンタル検索) (最強・最速)
ターミナル操作を効率化したい中級者のあなたが、まず最初にマスターすべき最強のショートカットキーが Ctrl+R です!
これは「reverse-i-search(後方逐次検索)」って呼ばれる機能で、history コマンドを実行するまでもなく、ターミナル上で「即座に」履歴を検索できちゃうんです!
Ctrl+R の使い方
1. ターミナルで Ctrl キーを押しながら R キーを押します。
2. プロンプトが (reverse-i-search) っていう表示に変わって、検索モードになります。
3. あなたが探したいコマンドに含まれるキーワード(一部でOK!)を入力し始めます。
例えば、「nginx.conf」っていうファイルを設定したコマンドを探したいとします。
# Ctrl+R を押す (reverse-i-search)`':
"nginx" と入力する
(reverse-i-search)`nginx': sudo vi /etc/nginx/nginx.conf
n g i n x って入力していくたびに、過去にさかのぼって、その文字列を含む直近のコマンドが自動的に表示(サジェスト)されます。賢い!
(表1)Ctrl+R の便利な操作
Ctrl+R には、さらに便利な操作がありますよ!
| キー操作 | 動作 |
|---|---|
Ctrl+R をもう一度 | サジェストされたコマンドが違う場合、さらに古い履歴を検索します。 |
Enter キー | 「これだ!」っていうコマンドが見つかったら、その場で即座に実行します。 |
矢印キー(→ や ←)(または Ctrl+E, Ctrl+A) | 「これだ!でも、ちょっとだけ編集したい」時に押します。 検索モードが解除されて、見つかったコマンドが入力された状態でプロンプトに戻ります。(これ、すっごく便利です!) |
Ctrl+G または Ctrl+C | 検索をキャンセルして、通常のプロンプトに戻ります。 |
history | grep よりも遥かに高速で直感的だから、ぜひマスターしてくださいね!
方法3: !(ビックリマーク)を使った再実行(上級・注意)
!(エクスクラメーション・マーク)は、履歴を直接「実行」するための、すっごく強力なショートカット(履歴展開)です。
⚠️【最重要警告】ちょっと上級者向けです!⚠️
この ! を使った方法は、Enterキーを押す前の確認が一切ありません!
! を含むコマンドを入力して Enter を押した瞬間、history から展開されたコマンドが即座に実行されます。
!rm なんて入力して、意図せず rm -rf / みたいな過去の危険なコマンドが実行されちゃうリスクもゼロじゃありません😱
使用する際は、実行されるコマンドが何であるか、100%の確信がある場合のみにしてくださいね!
!! (直前のコマンド)
最もよく使われて、比較的安全なのが !! です。
これは「直前に実行したコマンド」そのものを展開します。
最大の使い道は、「あ、sudo 付け忘れた!」っていう時です。
[user@server ~]$ vi /etc/hosts vi: '/etc/hosts' の書き込みに失敗しました: 許可がありません
[user@server ~]$ sudo !! sudo vi /etc/hosts <-- 自動的に展開されて実行される [sudo] password for user:
sudo を付け忘れて権限エラーになった直後に sudo !! って打つだけで、コマンドを打ち直す手間が省けちゃいます!
![番号] (履歴番号で実行)
history コマンドで表示された「履歴番号」を直接指定して実行します。
[user@server ~]$ history 503 vi ~/.bashrc ...
[user@server ~]$ !503 vi ~/.bashrc <-- 展開されて実行される
![文字列] (前方一致で実行)
指定した文字列で「始まる」、直近のコマンドを実行します。
[user@server ~]$ !vi vi ~/.bashrc <-- 展開されて実行される
(もし直近に vi /etc/hosts があれば、そっちが実行されちゃいます)
!$ と !* (直前の引数を参照)
- !$
「直前のコマンドの最後の引数」を展開します。
ファイル名やディレクトリ名を連続して使い回すときにすっごく便利です!
[user@server ~]$ mkdir -p /var/www/my-project/public [user@server ~]$ cd !$ cd /var/www/my-project/public <-- /var/www/my-project/public が展開される
- !*
「直前のコマンドのすべての引数」を展開します。
[user@server ~]$ ls file1.txt file2.txt file1.txt file2.txt [user@server ~]$ chmod 644 !* chmod 644 file1.txt file2.txt <-- file1.txt file2.txt が展開される
! を使った再実行は、慣れると高速ですけど、さっきも言った通りリスクも伴います。
まずは安全な Ctrl+R や history | grep からマスターすることをお勧めしますよ!
history コマンドによる履歴の「削除」
「linux コマンド 履歴」を管理する上で、時には履歴を「削除」したい場面がありますよね。
- コマンドラインに、うっかりパスワードやAPIキーを平文で入力しちゃった😱
- システムを破壊しかねない危険なコマンド(rm -rf とか)を履歴に残したくない…
こんな場合に、履歴を削除する方法を解説しますね。
方法1: history -d [番号] (特定の行を削除)
history で表示された履歴番号を指定して、その一行だけを(現在のセッションの)メモリ上から削除します。
[user@server ~]$ history 510 ls -l 511 cat /etc/my_secret_password.conf <-- これを消したい! 512 history
履歴番号 511 を指定して削除
[user@server ~]$ history -d 511
[user@server ~]$ history 510 ls -l 511 history <-- 512だった history が 511 に繰り上がった! 512 history -d 511
history -d は、history の出力の番号そのままを指定して削除します。
方法2: history -c (メモリ上の全履歴をクリア)
history -c は、現在ログインしているセッションのメモリ上にある履歴を、ぜーんぶ消去(Clear)します。
[user@server ~]$ history 3 513 ls 514 pwd 515 history 3
[user@server ~]$ history -c
[user@server ~]$ history 1 history
実行した瞬間、過去の履歴がすべて消えて、history コマンド自体の履歴だけが残ります。
【重要】履歴ファイル(~/.bash_history)への反映
ここで、すっっっごく重要な注意点があります!
history -d や history -c は、あくまで「今」のセッションのメモリ上の履歴を操作するだけなんです。
デフォルトのBashの設定だと、history -d で特定の行を削除しても、ログアウトする時に、結局メモリ全体の履歴が ~/.bash_history ファイルに「追記」されちゃうので、消したはずのコマンドがファイルに残っちゃうんです😥(意味ないじゃん!ってなりますよね)
パスワードみたいな機密情報を、ファイルからも恒久的に削除したい場合は、以下の手順を踏む必要があります。
手順1: 履歴ファイル(~/.bash_history)の直接編集
最も確実な方法は、履歴ファイルをテキストエディタで直接開いて、該当行を削除することです。
vi ~/.bash_history
エディタが起動したら、検索機能(vi なら /)で問題のコマンドを探して、dd なんかでビシッと行ごと削除して保存します。
手順2: history -d と history -w のコンボ
もし「現在のメモリ上の履歴」を「正しい状態」にした上で、それをファイルに「上書き」したい場合は、この手順を踏みます。
1. history -d [番号] で、メモリ上から消したいコマンドをぜんぶ削除します。
2. history を実行して、メモリ上の履歴がクリーンな(残したいものだけの)状態になったことを確認します。
3. history -w を実行します!
history -w(Write)は、現在のメモリ上の履歴を、履歴ファイル(~/.bash_history)に「上書き」するコマンドです。
# 511番(パスワード)をメモリから消す [user@server ~]$ history -d 511
現在のクリーンな履歴をファイルに「上書き」する
[user@server ~]$ history -w
これで、~/.bash_history からも機密情報が削除されます。ふぅ、一安心😅
もし、すべての履歴をファイルからも消去したい場合は、
history -c (メモリを全消去)
history -w (空のメモリをファイルに上書き)
の2つを連続で実行すればOKです!
【プロ設定】history を最強にカスタマイズする環境変数
「linux コマンド 履歴」を真に効率化する鍵は、history の動作をコントロールする「環境変数」のカスタマイズにあります。
これらの設定は、あなたのホームディレクトリにある ~/.bashrc(Bashシェルを使ってる場合)っていう設定ファイルに追記して、source ~/.bashrc を実行(または再ログイン)することで反映されますよ!
HISTSIZE と HISTFILESIZE (履歴の保存件数)
- HISTSIZE
シェルのセッション中、メモリ上に記憶しておくコマンドの最大行数です。
デフォルトは 500 や 1000 のことが多いですね。 - HISTFILESIZE
履歴ファイル(~/.bash_history)に保存するコマンドの最大行数です。
デフォルトの1000行だと、数日前のコマンド履歴も消えちゃいます…
ディスク容量が許す限り、これらはすっごく大きく設定しておくのが現代のベストプラクティスです!
▼推奨設定(~/.bashrc に追記):
# メモリ上にもファイルにも10万行保存する(これで安心!) export HISTSIZE=100000 export HISTFILESIZE=100000
HISTTIMEFORMAT (履歴にタイムスタンプを追加)
history のデフォルト出力には、「いつ」実行したかの情報がありませんよね。
HISTTIMEFORMAT を設定すると、履歴に日時が追加されて、トラブルシューティングの時に絶大な威力を発揮します!
▼推奨設定(~/.bashrc に追記):
# 「年-月-日 時:分:秒」のフォーマットで表示し、末尾にスペースを入れる export HISTTIMEFORMAT="%Y-%m-%d %T "
▼設定後の history 出力:
[user@server ~]$ history 3 515 2025-11-13 10:30:01 ls 516 2025-11-13 10:30:05 pwd 517 2025-11-13 10:30:10 history 3
これで、「いつ」「何をしたか」が明確になりますね!
HISTCONTROL (履歴の「質」を高める最重要変数)
HISTCONTROL は、どのようなコマンドを履歴に「残すか」または「残さないか」を制御する、最も重要な変数の一つです。
- ignorespace
コマンドの先頭にスペース(空白)を入力して実行すると、そのコマンドを履歴に残しません。
(これ、すっごく大事なテクニックですよ!💡)
パスワードやAPIキーをコマンドラインで一時的に使う場合に、[スペース]my_command --password=SECRETみたいに実行することで、履歴汚染を防げます。 - ignoredups
直前と同じコマンドを連続して実行した場合、履歴に1つだけ残します。
ls, ls, ls って3回実行しても、履歴には ls が1回だけ記録されるようになります。 - erasedups
履歴全体をチェックして、過去に同じコマンドがあれば、古い方を削除して新しい方だけを残します。 - ignoreboth
ignorespace と ignoredups の両方を有効にします。
▼推奨設定(~/.bashrc に追記):
# スペースで始まるコマンドは無視、かつ、直前の重複も無視する export HISTCONTROL=ignoreboth
(erasedups は便利な反面、意図しない履歴の消失を招くこともあるので、まずは ignoreboth から始めるのが無難ですよ)
HISTIGNORE (特定のコマンドを無視)
HISTCONTROL=ignorespace よりもさらに強力に、「特定のコマンドは(スペースなしでも)絶対に履歴に残さない!」って指定するのが HISTIGNORE です。
▼設定例(~/.bashrc に追記):
# ls, pwd, history, exit の各コマンドは、完全に履歴から無視する export HISTIGNORE="ls:pwd:history:exit"
コロン(:)で区切って、無視したいコマンドパターンを登録します。
ls -l みたいな引数付きの ls もぜんぶ無視されますよ。
(表2)history 環境変数まとめ
ちょっと複雑になってきたので、history 関連の環境変数を表にまとめますね!
| 環境変数 | 説明 | 推奨設定例 |
|---|---|---|
HISTSIZE | メモリ上に保存する履歴の行数 | export HISTSIZE=100000 |
HISTFILESIZE | 履歴ファイルに保存する行数 | export HISTFILESIZE=100000 |
HISTTIMEFORMAT | 履歴にタイムスタンプを追加する | export HISTTIMEFORMAT="%Y-%m-%d %T " |
HISTCONTROL | 履歴の保存ルールを制御する | export HISTCONTROL=ignoreboth |
HISTIGNORE | 特定のコマンドを履歴から除外する | export HISTIGNORE="ls:pwd:history" |
HISTFILE | 履歴ファイルの保存場所 | (デフォルト: ~/.bash_history)変更しない方が無難 |
(上級編)複数ターミナル間で履歴をリアルタイム共有する
history を使っていて、最大のイライラ・ポイントの一つが、「複数ターミナル問題」です。
ターミナルAで実行したコマンドが、すぐにターミナルBの history や Ctrl+R に反映されない!っていう、あの問題です。
これは、Bashがデフォルトでは「ログアウト時」にメモリ上の履歴をファイルに書き込む設定になってるからなんですね。これを解決して、コマンド実行のたびに履歴をファイルに追記して、他のターミナルもそれを即座に読み込むようにする、プロフェッショナルな設定(~/.bashrc に追記)を紹介します!
# 履歴を即時追記し、重複も削除 export HISTCONTROL=ignoreboth:erasedups
履歴を上書きではなく「追記」する設定
shopt -s histappend
PROMPT_COMMANDは、プロンプトが表示される直前に実行される「おまじない」
history -n: 履歴ファイルから「新しい」履歴を読み込む
history -a: 現在のメモリ履歴をファイルに「追記」する
export PROMPT_COMMAND="history -n; history -a; $PROMPT_COMMAND"
(※注:古い情報だと history -w(上書き)を使う例がありますけど、shopt -s histappend(追記モード)と history -a(メモリからファイルへ追記)を組み合わせるのが、他のターミナルの履歴を消さないための現代的な方法ですよ!)
この設定で、ターミナルAで実行したコマンドが、ターミナルBで Ctrl+R を押すと即座に検索対象になる、すっごく快適な履歴環境が実現します!
まとめ
「linux コマンド 履歴」を管理する history コマンドは、単なる「一覧表示」コマンドじゃなくて、Linux操作を劇的に効率化するための「データベース」とその「操作ツール」のセットだったんですね!
最後に、この記事で学んだ最重要ポイントを、もう一度おさらいしますね。
✅ 履歴の検索は Ctrl+R が最強!
history | grep “keyword” も確実ですけど、日常的な検索は Ctrl+R(後方逐次検索)が圧倒的に高速です。
✅ 履歴の再実行は !! と !$ を慎重に!
sudo !!(直前のコマンドをsudoで実行)はすっごく便利です。
ただし、! で始まるコマンドは「確認なしで即実行」されちゃうので、危険性を理解した上で使いましょうね。
✅ 履歴の削除は history -d [番号] と history -w
うっかりパスワードを入力しちゃったら、history -d [番号] でメモリから削除して、必ず history -w でファイルに「上書き」保存して、証拠を抹消しましょう!
✅ ~/.bashrc のカスタマイズは必須!
ターミナル操作を本気で効率化したいなら、以下の設定は必須ですよ!
HISTSIZE=100000 (履歴をたくさん保存)
HISTFILESIZE=100000 (同上)
HISTTIMEFORMAT=”%Y-%m-%d %T “ (タイムスタンプで実行日時を記録)
HISTCONTROL=ignoreboth (先頭スペース無視、連続重複無視)
✅ PROMPT_COMMAND で履歴をリアルタイム共有!
複数ターミナルを開くのが当たり前の現代で、PROMPT_COMMAND を設定して履歴を即時共有する環境は、生産性を大きく左右します。
history コマンドを使いこなすことは、CUI操作のストレスを減らして、より複雑で高度なタスクに集中するための第一歩です。
まずは Ctrl+R と ~/.bashrc のカスタマイズから始めて、あなただけの「最強の履歴環境」を構築してみてくださいね!💪✨

コメント