�� 这里需要注意的是,当我们在历史记录中搜索的时候,是有位置标记的,Ctrl+R 是指从当前位置开始,逆向搜索,R 代表的是 reverse,每搜索一条记录,位置标记都会向历史记录的头部移动,下次搜索又从这里开始继续向头部搜索。所以,我们一定要记住快捷键 Alt+>,它可以把历史记录的位置标记还原。另外需要注意的是停止搜索历史记录的快捷键有三个,如果按 Enter 键,匹配的命令就立即执行了,如果你还想有修改这条命令的机会的话,一定不要按 Enter,而要按 Esc。如果什么都不想要,就按 Ctrl+G 吧,它会还你一个空白的命令行。
快速引用和修饰历史命令 除了查看和搜索历史记录,我们还可以以更灵活的方式引用历史记录中的命令。常见的简单的例子有 !! 代表引用上一条命令,!$代表引用上一条命令的最后一个参数,^oldstring^newstring^代表将上一条命令中的 oldstring 替换成 newstring。这些操作是我们平时使用命令行的时候的一些常用技巧,其实它们的本质,是由 history 库提供的 history expansion 功能。Bash 使用了 history 库,所以也能使用这些功能。其完整的文档可以查看 man history 手册页。知道了 history expansion 的理论,我们还可以做一些更加复杂的操作,如下图:
引用和修饰历史命令的完整格式是这样的:
![!|[?]string|[-]number]:[n|x-y|^|$|*|n*|%]:[h|t|r|e|p|s|g]可以看到,一个对历史命令的引用被 : 分为了三个部分,第一个部分决定了引用哪一条历史命令;第二部分决定了选取该历史命令中的第几个单词,单词是从0开始编号的,也就是说第0个单词代表命令本身,第1个到最后一个单词代表命令的参数;第三部分决定了对选取的单词如何修饰。下面我列出完整表格:
表格一、引用哪一条历史命令:
操作符功能! 所有对历史命令的引用都以 ! 开始,除了 ^oldstring^newstring^ 形式的快速替换
!n 引用第 n 条历史命令
!-n 引用倒数第 n 条历史命令
!! 引用上一条命令,等于 !-1
!string 逆向搜索历史记录,第一条以 string 开头的命令
!?string[?] 逆向搜索历史记录,第一条包含 string 的命令
^oldstring^newstring^ 对上一条命令进行快速替换,将 oldstring 替换为 newstring
!# 引用当前输入的命令
表格二、选取哪一个单词:
操作符功能0 第0个单词,在 shell 中就是命令本身
n 第n个单词
^ 第1个单词,使用 ^ 时可以省略前面的冒号
$ 最后一个单词,使用 $ 是可以省略前面的冒号
% 和 ?string? 匹配的单词,可以省略前面的冒号
x-y 从第 x 个单词到第 y 个单词,-y 代表 0-y
* 除第 0 个单词外的所有单词,等于 1-$
x* 从第 x 个单词到最后一个单词,等于 x-$,可以省略前面的冒号
x- 从第 x 个单词到倒数第二个单词
表格三、对选取的单词做什么修饰:
操作符功能h 选取路径开头,不要文件名
t 选取路径结尾,只要文件名
r 选取文件名,不要扩展名
e 选取扩展名,不要文件名
s/oldstring/newstring/ 将 oldstring 替换为 newstring
g 全局替换,和 s 配合使用
p 只打印修饰后的命令,不执行