zshのsetoptを試してみる(履歴)

履歴に関するzshのsetoptを試してみる。


.zshrcには下記の設定をして、履歴のファイルを保存するようにしておく。

HISTFILE=~/.zsh_history
HISTSIZE=100000
SAVEHIST=100000

extended_history

extended_historyを設定すると、.zsh_historyに開始時刻や実行時間が記録される。

$ cat .zsh_history
: 1461321035:0;ls
: 1461321038:0;cd /tmp
: 1461321040:0;exit

hist_ignore_all_dups

hist_ignore_all_dupsを設定していると、
過去に同じ履歴が存在する場合、古い履歴を削除し、重複しないようになる。

例えば、履歴が下記の状態で、lsコマンドを実行すると、

% history
    1  cd aaa
    2  cd bbb
    3  cd ccc
    4  ls
    5  cd ddd
    6  cd eee
    7  cd fff

下記のように、途中のlsコマンドの履歴は削除される。

% history
    1  cd aaa
    2  cd bbb
    3  cd ccc
    5  cd ddd
    6  cd eee
    7  cd fff
    8  ls

hist_ignore_dups

通常、同じコマンドを繰り返すと、全て履歴に残る。

$ history
    1  ls
    2  ls
    3  ls

hist_ignore_dupsを設定していると、前回と同じコマンドは履歴に追加されなくなる。

$ history
    1  ls

当然ながら、前回と異なるコマンドを交互に繰り返すと、下記のような感じで履歴が残っていく。

$ history
    1  cd
    2  ls
    3  cd
    4  ls
    5  cd
    6  ls

hist_ignore_space

hist_ignore_spaceを設定していると、コマンドの先頭がスペースの場合、履歴に追加されない。

$ cd aaa
$  cd bbb
$ cd ccc
$ history
    1  cd aaa
    2  cd ccc

hist_save_no_dups

通常、historyコマンドも履歴に残るが、

$ history
    1  history

hist_save_no_dupsを設定していると、記録されなくなる。


hist_reduce_blanks

通常、余計な空白があっても、履歴にはそのまま記録される。

$ ls           -la
$ history
    1  ls           -la

hist_reduce_blanksを設定していると、余計な空白は除去して記録してくれる。

$ ls           -la
$ history
    1  ls -la

share_history

通常、実行した履歴を他のターミナルで見れない。

term1$ cd aaa
term1$ cd bbb
term1$ cd ccc
term2$ history

share_historyを設定していると、他のターミナルでも見れるようになる。

term1$ cd aaa
term1$ cd bbb
term1$ cd ccc
term2$ history
    1* cd aaa
    2* cd bbb
    3* cd ccc

ちなみに、share_historyを設定すると、
リアルタイム、かつ時刻付きで、履歴がファイルに書き込まれる。

$ cd aaa
$ cd bbb
$ cd ccc
$ cat .zsh_history
: 1461325234:0;cd aaa
: 1461325236:0;cd bbb
: 1461325237:0;cd ccc
: 1461325242:0;cat .zsh_history

ただし、extended_historyが設定されていないと、zsh終了時には時刻なしで保存されるので注意。

$ exit

(再ログイン)

$ cat .zsh_history
cd aaa
cd bbb
cd ccc
cat .zsh_history