はじめに
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}')