Linux / コマンド / history / 以前に実行したコマンドの一覧を表示するコマンド

Linux では、Bash の history コマンドは、現在のシェルで管理されているコマンド履歴を番号付きで表示します。履歴を確認して以前のコマンドを探したり、再実行したりできます。また、履歴の範囲や保存はシェルの設定に依存します。

コマンド履歴の確認

インタラクティブな Bash ターミナルで次のコマンドを入力します。history は組み込みの Bash コマンドで、現在のシェルの履歴リストを出力します。

history

出力には各項目の番号とコマンドが表示されます。例えば、42 pwd と表示されている行は、シェルの履歴の 42 番目の項目が pwd であることを意味します。番号や内容はアカウント、セッション、履歴設定に応じて異なるため、例の番号を直接使用しないでください。入力するコマンドは記録されますが、実行結果は記録されません。

最近の項目のみを表示するには、番号を指定します。次のコマンドは履歴の最後の 10 件を表示します。

history 10

このhistory 10コマンド自体がリストに含まれることもあります。希望するコマンドが表示されない場合は、履歴機能、ストレージ容量、除外設定を確認してください。

履歴の検索と再実行

Bashのデフォルトの対話型入力では、上矢印キーを押すと以前の入力を呼び出して編集できます。Ctrl+Rを押して検索語を入力すると、履歴を逆方向に検索できます。見つかったコマンドの内容を確認した後、実行または修正できます。

履歴展開が有効な対話型の Bash では、!! は前の履歴エントリに展開されます。!n はリスト内の番号 n の項目を指します。例えば、現在のリストに番号 42 がある場合、次のコマンドはその項目を実行します。

!42

番号が実際の履歴と一致していることを必ず確認してください。履歴展開は通常、入力後すぐに実行されるため、ファイル削除や設定変更などのコマンドには特に注意が必要です。非対話型シェルでは、履歴展開は通常デフォルトで無効になっており、他のシェルでは挙動が異なる場合があります。

前のエントリの展開結果を実行せずに確認したい場合は、シングルクォートで囲んで以下のように入力します。画面に表示されるコマンドは実行されません。

history -p '!!'

shopt -s histverify を設定すると、Readline を使用したインタラクティブな Bash の編集ライン上に展開されたコマンドが表示され、実行前に確認できるようになります。現在のシェルで設定を元に戻すには shopt -u histverify を使用します。詳細については Bash の履歴展開ドキュメント を参照してください。

履歴が保存される場所とタイミング

Bash は履歴をメモリ内のリストとして管理し、起動時に HISTFILE で指定されたファイルから履歴を読み込みます。一般的なデフォルトファイルは ~/.bash_history ですが、環境や POSIX モードによって異なる場合があります。現在の設定は次のコマンドで確認できます。

printf '%s\n' "$HISTFILE"

履歴が有効なシェルが終了すると、その履歴はファイルに保存されますが、ファイルが書き込み不可の場合、HISTFILE が設定されていない、または空の場合は保存されません。複数の端末はそれぞれ別々の履歴を持つため、ある端末で実行されたコマンドは別の端末にすぐには反映されないことがあります。histappend オプションに従って、終了時にファイルは追記されるか上書きされますが、その結果は設定や同時セッションによって異なります。

history -aは、現在のセッションでまだ追加されていない新しいエントリを履歴ファイルに追加します。一方、history -wは、現在のリストで履歴ファイルを上書きするため、他のセッションの履歴が失われる可能性があります。複数のターミナルを使用する場合は、使用前にこの違いを確認してください。保存の動作はBashの履歴機能のドキュメントで確認できます。

履歴サイズと除外設定を確認する

HISTSIZEはメモリ内の履歴エントリの数を制御し、HISTFILESIZEは履歴ファイル内の最大行数を制御します。複数行のエントリはファイル内の行数カウントの例外です。現在の値は次の方法で確認できます。

printf 'HISTSIZE=%s\nHISTFILESIZE=%s\nHISTCONTROL=%s\nHISTIGNORE=%s\n' "$HISTSIZE" "$HISTFILESIZE" "$HISTCONTROL" "$HISTIGNORE"

HISTCONTROL と HISTIGNORE は、どの入力を履歴から除外するかを決定できます。たとえば、HISTCONTROL に ignorespace が含まれている場合、スペースで始まる入力は履歴リストから除外されることがあります。これはシェル履歴に関連する設定のみであり、他のログやプログラムに残っている履歴を消去するものではありません。

履歴の削除と機密情報

history -d n は、現在のシェルの履歴リストから n 番目の項目を削除します。まず history で実際の番号を確認してください。history -c は現在のリスト全体を消去するため、使用には注意が必要です。これらの 2 つのコマンドは、保存済みの履歴ファイルや、他のシェルの履歴リストを自動的に消去するものではありません。

パスワードやトークンをコマンドラインに直接入力することは避けてください。コマンド履歴や他の場所に残る可能性があります。既に秘密情報が漏洩している場合、履歴を削除するだけで問題が解決するとは考えないでください。その代わりに、資格情報を置き換え、関連する漏洩範囲を確認してください。