历史扩展(HISTORY EXPANSION)

shell 支持历史扩展机制,类似于 csh 中历史扩展。这一节描述了可用的语法特征。在交互的 shell 中这一机制被默认启用, 可以使用内建命令 set-H 选项来禁用它 (参见下面的 shell 内建命令(SHELL BUILTIN COMMANDS) 章节)。非交互的 shell 默认不进行历史扩展。

历史扩展将历史列表中的词引入输入流中,使得可以方便地重复已执行命令, 在当前输入行中为前一个命令插入新的参数, 或者快速修正前一个命令中的错误。

历史扩展在读入一整行后,在 shell 将它拆分成词之前立即进行。它 由两部分组成。首先是判断替换中使用历史列表中哪一行。其次是选择那一行中要包含到当前行中的部分。 从历史中选择的行称为 event,从那一行中选择的部分是 words。 可以用多种多样的 modifiers 来操纵所选的词。在读入输入时,行被按照同样方式分解成词, 因此多个以 metacharacter 分隔的词,如果被引号包含,就被当成一个词。 历史扩展由历史扩展字符引入,默认是 !。只有反斜杠 () 和单引号可以引用历史扩展字符。

内建命令 shopt 可以设定多个选项值,来调整历史扩展的行为。如果 shell 选项 histverify 被启用 (参见内建命令 shopt 的描述),并且正在使用 readline, 历史替换不会被立即传给 shell 解释器。与此相对,扩展后的行被重新载入 readline 编辑缓冲区,进行进一步的修改。如果正在使用 readline, 并且启用了 shell 选项 histreedit, 失败的历史替换将被重新载入到 readline 编辑缓冲区,进行改正。内建命令 history-p 选项可以用来在执行之前查看历史扩展将如何进行。内建命令 history-s 选项可以用来在历史列表末尾添加命令,而不真正执行它们,从而 在接下来的调用中可以使用它们。

shell 允许控制历史扩展机制使用的多种字符 (参见上面的 Shell Variableshistchars 的描述)。