9.1 Bash 历史功能(Bash History Facilities)

当使用内建命令 set(参见 4.3.1《内建命令 set》)将“-o history”选项开启了,shell 则会提供对命令历史的访问功能。命令历史是用户之前键入的命令列表。shell 变量 HISTSIZE 的值是用做指定保存到历史列表中命令的数量。会将最后$HISTSIZE(默认为 500)条命令保存。shell 会在历史扩展之后,参数和变量扩展之前将命令存储于历史列表之中,其行为受到 shell 变量 HISTIGNORE 和 HISTCONTROL 的影响。

当 shell 启动时,会从变量 HISTFILE 中所指定的文件名(默认为“~/.bash_history”)初始化历史列表。如果需要,由变量 HISTFILE 的值所指定的文件中所包含的历史条目数量会进行删减,使其不会多于由变量 HISTFILESIZE 所指定的数量。当开启了历史的 shell 退出时,在历史列表中最后的$HISTSIZE个行命令会复制到$HISTFILE 所指定的文件中去。如果设置了 shell 选项“histappend”选项(参见 4.2《Bash 内建命令》),则将这些行追加到历史文件末尾,否则则是覆盖历史文件。如果释放了或未设置变量 HISTFILE,或如果历史文件不可写入,则不能保存命令历史。在保存了历史之后,会对历史文件进行删减,以确保其包含的条目数量不大于$HISTFILESIZE 个。如果 HISTFILESIZE 未设置或已释放,或设置为空,或为一个非数字值,或其值是小于零的,则不会对历史文件进行删减。

如果设置了 HISTTIMEFORMAT 变量,关联到每一个历史条目的时间截信息会写入到历史文件中去,并使用历史注释字符进行标记。当读取历史文件时,以历史注释开头的行后面跟随着的数字会被翻译为其后历史条目的时间截。

内建命令 fc 可用于列出或编辑和重新执行部分历史列表。内建命令 history 可用于显示或修改历史列表并可以操纵历史文件。当使用命令行编辑时,在每一种可提供历史列表访问的编辑模式下都可以进行命令搜索(参见 8.4.2《操纵历史的命令》)。

shell 允许控制哪些命令可以保存到历史列表中。可以通过设置变量 HISTCONTROL 和 HISTIGNORE 来使 shell 只保存已输入命令集合的子集。如果开启了 shell 选项“cmdhist”,会使 shell 试图将多行命令的每一行保存为一个历史条目,并且在需要的地方添加分号以保证语法的正确性。shell 选项“lithist”会使 shell 将带有分号的命令替换为带有内嵌换行的命令进行保存。内建命令 shopt 用于设置这些选项,可参见 4.3.2《内建命令 shopt》。