履歴番号を指定して履歴削除する
パスワードを平文でコマンドラインに書いた場合など、狙い撃ちで履歴から削除したい場合がある.
history -10
history -d 履歴番号
- 直近10個のコマンド履歴を表示して履歴番号を確認し、番号を指定して削除する.
特定パターンを履歴削除する
これが、この記事の本題.
grep、diff、less、man、git status、git log などの内容確認や状況確認コマンドは、セッション中は履歴に残して Ctrl+R や Ctrl+P で再利用したいが、仕事が終われば作業記録上のゴミである. そこで履歴をファイルに書き出し、egrep -v で不要なパターンを除去して、その結果を履歴に読み込むことで履歴から削除する. この一連の作業をシェルスクリプトにしたいところだが、履歴はシェル環境に保持されており、シェルスクリプトは実行開始時にシェル環境を複製し、終了時に破棄してしまうので不適切. そこでシェル関数として作成し、それを ~/.bashrc に直接書くか、関数記述ファイルを ~/.bashrc から source で取り込む.
function.sh
histclean()
{
# save current history to $HISTFILE.
history -w
if [ "$1" == "-e" ]; then
# edit history
${EDITOR:-vi} $HISTFILE
history -c && history -r $HISTFILE
else
# remove status check commands from history.
local new=$(mktemp)
command egrep -vw \
-e '^(ls|ll|lt|la|l|h|[ef]?grep|ps|diff|less|man|help|histclean)' \
-e '^git (status|show|grep|diff.*|log.*|[a-z]l|st|ss|crlf)' \
$HISTFILE > $new
history -c && history -r $new && history -w
command rm $new
fi
}
- egrep に与える除外パターンはお好みで調整する.
- -e オプション指定時は、エディタで履歴ファイルを編集する.
全履歴を消す
過去のコマンド履歴を全て忘れたい.
history -c && history -w
- history -w を忘れると、今回セッションの履歴は消えるが、前回セッションの履歴は残るかもしれない.
- ログアウト処理で $HISTFILE への書き戻しをどのようにしているのかに依存する.
最初から履歴に入れないための設定
ここから先は、改めて書くことでもないが、網羅的な資料としたいのであえて記す.
履歴用の変数を設定することで、履歴対象から外すことができる. 設定は ~/.bashrc に記入すればOK.
重複コマンドなどを履歴に残さない
~/.bashrc
HISTCONTROL=ignoreboth
- 直前と同じコマンドは履歴に残さない.
- コマンド行の先頭に空白を入れると履歴に残さない.
指定したパターンに合致するコマンドを履歴に残さない
~/.bashrc
HISTIGNORE='?:??:???:exit'
- 履歴に残したくないパターンをコロンで区切って記述する. 上記の例では1~3文字のみのコマンド(ls,cd,pwd 等)および、exit を除外指定している.
##【おまけ】コマンド実行日時を履歴に記録する設定
~/.bashrc
HISTTIMEFORMAT='%F %T '
- 設定する書式は strftime と同じ。詳細は
man strftime