Linux historyコマンドの詳細解説と実践的活用法

はじめに

Linuxのターミナル作業において、historyコマンドは実行済みコマンドの記録を管理する重要なツールです。デフォルトでは、実行したコマンドはメモリ上に保持され、シェル終了時にユーザーホームディレクトリの.bash_historyファイルに保存されます。この機能はシステム監査やトラブルシューティングで不可欠です。

基本的な機能と仕組み

historyコマンドはメモリ上の履歴リストを操作します。環境変数HISTSIZEで最大保存件数を制御(デフォルト1000件)。履歴ファイルの保存先はHISTFILEで変更可能で、デフォルトは~/.bash_historyです。なお、コマンド実行時刻は内部記録されていますが、標準では非表示です。

コマンド構文

history [オプション] [引数]

主要な使用パターン:

# 直近20件を表示
history 20

# 履歴リストの全削除
history -c

# 特定のエントリを削除(例:50番目)
history -d 50

# 現在のセッション履歴をファイルに追記
history -a

# ファイルから未読の履歴を読み込み
history -n

# ファイルの内容を履歴リストに追記
history -r

# 現在の履歴リストをファイルに上書き
history -w

環境変数の設定

タイムスタンプの表示形式

実行時刻を表示するにはHISTTIMEFORMATを設定します:

export HISTTIMEFORMAT='%Y/%m/%d %H:%M:%S '

この設定後、historyコマンドで各エントリに日時が表示されます。

記録対象からのコマンド除外

不要なコマンドを記録しないようHISTIGNOREで指定:

export HISTIGNORE="cd:pwd:whoami:exit"

複数のコマンドはコロンで区切ります。正確なコマンド名を指定する必要があり、「ls」は「ls -l」とは別として扱われます。

履歴件数の制御

メモリ上の最大保持件数:

export HISTSIZE=2000

履歴ファイルの最大保存件数:

export HISTFILESIZE=5000

履歴ファイルのカスタマイズ

export HISTFILE=~/.command_log

重複コマンドの処理

HISTCONTROLで重複エントリの扱いを設定:

# 連続した重複のみ無視(デフォルト)
export HISTCONTROL=ignoreboth

# すべての重複を記録
export HISTCONTROL=ignoredups

# 履歴全体から重複を削除
export HISTCONTROL=erasedups

履歴機能の無効化

export HISTSIZE=0

注意: 上記設定は現在のセッションのみ有効です。永続化するには~/.bashrcや/etc/profileに追記してください。

実践的な活用テクニック

インタラクティブな検索

Ctrl+rで対話的な逆方向検索を起動します。検索ワードを入力すると一致した最新のコマンドが表示され、さらにCtrl+rを押すことで古いエントリに遡れます。

直近コマンドの再実行

!!      # 直前のコマンド
!-1     # 同上(別記法)

特定番号のコマンド再実行

!50     # 履歴番号50のコマンドを実行

コマンド名による再実行

!grep   # 直近のgrepコマンドを実行

引数の再利用

直前コマンドの引数を再利用:

!^      # 最初の引数
!$      # 最後の引数
!:2     # 2番目の引数

特定コマンドの引数を再利用:

!cat:^  # 直近のcatコマンドの最初の引数
!cat:$  # 直近のcatコマンドの最後の引数
!cat:3  # 直近のcatコマンドの3番目の引数

履歴の完全削除

# メモリ上の履歴のみ削除
history -c

# 履歴ファイルも削除
> ~/.bash_history

実装例

例1:監査対応の設定

# ~/.bashrcに追記
export HISTTIMEFORMAT='%Y-%m-%d %T '
export HISTSIZE=5000
export HISTFILESIZE=10000
export HISTCONTROL=erasedups
shopt -s histappend

例2:効率的なコマンド再利用

# システムログ検索
tail -f /var/log/syslog

# 別のログファイルで同様の監視
tail -f !$  # 最後の引数(ファイルパス)を再利用

# 複雑なgrepコマンド
grep -r "error" /var/log/nginx/

# 別のパターンで同ディレクトリ検索
grep -r "warning" !:2  # 2番目の引数(ディレクトリ)を再利用

例3:安全な履歴管理

# 機密情報を含むコマンドを履歴に残さない
export HISTIGNORE="*password*:*secret*:*token*"

# 現在のセッションの機密コマンドを削除
history -d $(history | grep -i password | awk '{print $1}')

タグ: linux bash history-command HISTTIMEFORMAT HISTCONTROL

9月28日 15:58 投稿