3.1 设置历史变量

无论是 bash 还是 zsh,都能够将我们已经执行过的命令存储到一个文件中。这样,便于我们以后对其加以重复使用。要查看 bash 或 zsh 的历史文件位置,不妨执行:

xiaodong@codeland:~$ echo $HISTFILE

在 bash 中,我们可以看到,这个文件默认是存储到 ~/.bash_history 的。但是,因为 zsh 默认并没有设置该变量,所以内容为空。

通过向 $HISTFILE 变量赋予新值,从而能够更改历史文件的保存位置。下面,我们将 zsh 的历史文件设置为 ~/.zsh_history。先使用文本编辑器(比如 nvim)打开 ~/.zshrc,然后添加下行内容:

HISTFILE=~/.zsh_history

对 bash 而言,另外两个重要的历史变量是 $HISTFILESIZE$HISTSIZE。其中,前者为 $HISTFILE 文件所能保存的最大行数,而后者则为 Shell 中记忆的最大历史命令数。这两个变量默认的设置都是 500,换句话说 ~/.bash_history 文件最多保留 500 行,且最多 500 个命令。为了最大限度的利用历史文件的价值,我们不妨考虑把这两个变量的值设得更大一些,比如 5000:

HISTFILESIZE=5000
HISTSIZE=5000

将以上两行内容追加到 ~/.bashrc 中以便永久保存设置。通常将这两个变量设置的值保持一致,否则在 $HISTFILE 中保存的内容可能会被截断。比如,在 $HISTSIZE 设为 1000 的情况下,而 $HISTFILESIZE 却为 500。因为历史命令数大于文件的行数,所以有部分历史命令不能保存到历史文件中。

$HISTSIZE 变量在 zsh 中同样有效,但与 $HISTFILESIZE 变量等价的却变成了 $SAVEHIST。类似的,我们将 ~/.zsh_history 保留的最大行数和命令数也设为 5000:

SAVEHIST=5000
HISTSIZE=5000

把上面两行内容添加到 ~/.zshrc 中以便永久保存设置。

既然存储的这些历史命令如此重要,那么就很有必要维护一个整洁、有价值的命令清单了。比如,剔除掉那些重复的命令、开头包含空格的命令、以及常用的简单命令等等。要实现这个目的,在 bash 中我们可以使用 $HISTCONTROL 变量。

$HISTCONTROL 采用冒号分隔的列表来决定是否将命令保存到历史文件中。例如,erasedups 表示去掉重复的命令,而 ignorespace 则意为除去开头具有空格的命令。

HISTCONTROL='erasedups:ignorespace'

在 zsh 中没有与 bash 对应的内置变量 $HISTCONTROL,不过可以通过设置选项来达到同样的效果:

setopt HIST_IGNORE_ALL_DUPS # 去掉重复的命令
setopt HIST_IGNORE_SPACE    # 去掉开头具有空格的命令