zsh の履歴関係オプションの備忘録です.
zsh の履歴が気がつくとものすごく大量になってきたのと,これは履歴に残しておかなくても良いよなぁ……というものがたくさんあったので,この辺りを整理するオプションについて調べたことをメモしておきます.ただし,私の使ってるものだけ.
なお,zsh のオプション全体については,
$ man zshoptions
をご覧ください.たくさんあり過ぎて心が折れます.正直言って.
既設定されている履歴関係オプション
私の場合は zprezto を使っているので,事前に設定されているオプションを調べておきます.
調べ方は
$ setopts
です.特に履歴関係で設定されているオプションは以下のようです.
Extended_History # timestamp を含めた形式の履歴の形式にする HIST_EXPIRE_DUPS_FIRST # 履歴上限に達したら重複排除を実施する HIST_FIND_NO_DUPS # line editor モードで重複した履歴の表示を行わない HIST_IGNORE_ALL_DUPS # 全ての重複を排除する HIST_IGNORE_DUPS # 直前と被る重複を排除する HIST_IGNORE_SPACE # 先頭スペースの場合は履歴に含めない HIST_SAVE_NO_DUPS # 履歴ファイルに書き込む際,新しいものと重複する古いコマンドを削除する HIST_VERIFY # 履歴を参照したコマンドを直接実行しない SHARE_HISTORY # コマンドが(履歴から)読み込まれると同時に履歴ファイルに書き込みを行う
新たに設定した履歴関係オプション
新たに設定したオプションは以下の通りです.
setopt HIST_NO_STORE # history コマンドは履歴に含めない setopt HIST_REDUCE_BLANKS # 余分なスペースを削除する setopt HIST_LEX_WORDS # 空白の取扱を通常のシェルと同様にする
なお,私の場合は zprezto を使っているので,これに標準で設定されているオプションは省いています.
履歴関係オプションの備考
- APPEND_HISTORY
複数の zsh が実行されているとき,履歴としてファイルに残されるのは最後に終了したシェルのものだけなのを(終了順に置き換えが実行される),終了順に追加していく方式に変更する.INC_APPEND_HISTORY も同様の機能を持つが,違いは履歴ファイルにすぐに記録されるのか,終了時に記録されるかの違いらしい. - HIST_IGNORE_DUPS
HIST_IGNORE_ALL_DUPS と違い,直前のものと全く同じコマンドの場合だけ重複排除される.だから,HIST_IGNORE_ALL_DUPS が設定されている場合はこのオプションは意味がない.
- HIST_EXPIRE_DUPS_FIRST
履歴の保存上限に達したとき,まず重複排除が行われ,そのあと古い方から履歴の削除が行われる.つまり,上限到達後は HIST_IGNORE_ALL_DUPS と全く同じ動作になるということ. - HIST_LEX_WORDS
zsh の場合,履歴は,たとえ quote されていたとしても空白のところで単語が区切られて処理されるが,このオプションを設定すると通常のシェルと同様の取扱ができるようになる.しかし,大量の履歴がある場合,処理速度に問題が生じる場合がある. - INC_APPEND_HISTORY
SHARE_HISTORY の一部動作と同等なので,同時に setopt されるべきではない.
まとめ
どうも zprezto を使っている場合は余分な履歴がかなりの程度排除されるような設定になってるっぽいです.したがって出来る対策としては,上記の通りあとちょっとだけ不要な部分を削除するオプションを設定することと,履歴に入れたくないコマンドについては先頭にスペースを付加して実行する癖をつけることのようです.
なお,よく実行するコマンドで履歴に入れたくないものは,alias に先頭スペース付きで登録しておくってのが賢そう.例えば man コマンドを履歴に入れたくないなら
$ vi ~/.zshrc alias man=' man'
のようにエイリアスを知ておけば良い訳ですね.
あとはたまに .zhistory から不要なものを削除するしか無さそうな感じでしょうか.
以上!