9.2 Bash 内建历史命令(Bash History Builtins)

Bash 提供了两个用于操纵历史列表和历史文件的内建命令。

fc

fc [-e ename] [-lnr] [first] [last] fc -s [pat=rep] [command]

第一种格式的语法是选择从历史列表中“first”到“last”范围内的命令,并对它们进行显示或编辑和重新执行。参数“first”和“last”都可以指定为字符串(用于定位到以该字符串开头的最近执行过的命令)或指定为一个数字(历史列表中的索引号,负数代表从当前命令编号的偏移量)。

当用于显示列表时,“first”或“last”的“0”值等同于“-1”,并且“-0”等同于当前命令(通常是 fc 命令);否则“0”等同于“-1”,“-0”则是无效的。

如果没有指定“last”参数,其会被设置为“first”的值。如果没有指定“first”,用于编辑时则设置为上一条命令,用于显示列表时会设置为“-16”。如果给出“-l”选项,则在标准输出中列出命令。“-n”选项会在列出命令时省略命令编号。“-r”选项会将列表反转顺序显示。最后由“ename”指定的编辑器会打开包含该命令所指定的历史命令。如果“ename”没有给出,则会使用“${FCEDIT:-${EDITOR:-vi}}”变量扩展的值。这表示如果设置了变量 FCEDIT 则使用该变量值,否则如果设置了变量 EDITOR 则使用该变量值,或如果前面两个变量都没有设置则使用 vi 编辑器。当编辑完成,所编辑的命令会被显示并执行。

在第二种格式语法中,在已选择的“command”中的“pat”的每一个实例会被替换为“rep”之后,重新执行新生成的命令。“command”会被解释为与上面语法中“first”相同的命令。

对于 fc 命令非常有用的别名(参见 6.6《别名》)是“r=‘fc -s”。因此输入“r cc”会运行最近一条以“cc”开头的命令。输入“r”会重新执行最后一条命令。

history

history [n] history -c history -d offset history -d start-end history [-anrw] [filename] history -ps arg

当不带选项调用该命令时,显示带有行编号的命令历史列表。带有星号“*”前缀的行表明该行命令是被修改过的。参数“n”代表显示最后“n”行命令。如果 shell 变量 HISTTIMEFORMAT 设置了并且不为空,其被用作 strftime 的时间格式字符串,用于显示关联到每一个历史条目的时间截。不会打印在格式化时间截与历史命令行之间的空白。

如果给出选项,则具有以下含义:

选项含义
-c清空历史列表。该项可与其它选项混合使用来完全替换历史列表。
-d offset在“offset”位置删除历史条目。如果“offset”是正数,其所指定的位置是在显示历史列表时其出现的位置。如果“offset”是负数,其解释为相对于最后一条历史条目大于 1 的位置,所以负数索引是从历史列表末尾向前计数,并且索引数“-1”引用到当前“history -d”命令上。
-d start-end删除从“start”到“end”位置之间的所有历史条目,包含这两个位置点的条目。对于“start”和“end”的正数和负数的解释,则与上面“-d offset”是一样的。
-a将新的历史行记录追加到历史文件中。这些历史行记录是从当前 Bash 会话开始到现在的,并且是未追加到历史文件中的所有记录。
-n将从历史文件中未读取过的历史行记录追加到当前历史列表中。这些历史行记录是自当前 Bash 会话开始后追加到历史文件中的记录。
-r从历史文件中读取的行记录追加到历史列表中。
-w将当前历史列表写入到历史文件中。
-p在“arg”参数上执行历史替换并且在标准输出中显示结果。其不会在历史列表中对结果进行排序。
-s“arg”作为单一记录添加到历史列表的末尾。

当使用“-w”、“-r”、“-a”或“-n”选项中的任意一个的时候,如果给出参数“filename”,则选项作用于该参数所指定的历史文件。如果没有给出该参数,则作用于变量 HISTFILE 所指定的历史文件上。