bash shell 维护着一个已经执行过的命令的历史列表。这个命令列表被保存在你主目录下,一个叫做 .bash_history 的文件里。这个 history 工具是个有用资源,因为它可以减少你敲键盘的次数,尤其当和命令行编辑联系起来时。
搜索历史命令
在任何时候,我们都可以浏览历史列表的内容,通过:
[c.biancheng.net]$ history | less
在默认情况下,bash 会存储你所输入的最后 500 个命令。在随后的章节里,我们会知道怎样调整这个数值。
比方说我们想要找到列出目录 /usr/bin 内容的命令。一种方法,我们可以这样做:
[c.biancheng.net]$ history | grep /usr/bin
比方说在我们的搜索结果之中,我们得到一行,包含了有趣的命令,像这样:
88 ls -l /usr/bin > ls-output.txt
数字“88” 是这个命令在历史列表中的行号。随后在使用另一种展开类型时,叫做历史命令展开,我们会用到这个数字。我们可以这样做,来使用我们所发现的行:
[c.biancheng.net]$ !88
bash 会把“!88” 展开成为历史列表中 88 行的内容。还有其它的历史命令展开形式,我们一会儿讨论它们。
bash 也具有按递增顺序来搜索历史列表的能力。这意味着随着字符的输入,我们可以告诉 bash 去搜索历史列表,每一个附加字符都进一步提炼我们的搜索。
启动递增搜索,输入 Ctrl+r,其后输入你要寻找的文本。当你找到它以后,你可以敲入 Enter 来执行命令,或者输入 Ctrl+j,从历史列
表中复制这一行到当前命令行。再次输入 Ctrl+r,来找到下一个匹配项(向上移动历史列表)。
输入 Ctrl+g 或者 Ctrl+c,退出搜索,实际来体验一下:
[c.biancheng.net]$
首先输入 Ctrl+r:
(reverse-i-search)`':
提示符改变,显示我们正在执行反向递增搜索。搜索过程是“反向的”,因为我们按照从”现在” 到过去某个时间段的顺序来搜寻。下一步,我们开始输入要查找的文本。在这个例子里是“/usr/bin”:
(reverse-i-search)`/usr/bin': ls -l /usr/bin > ls-output.txt
即刻,搜索返回我们需要的结果。我们可以执行这个命令,按下 Enter 键,或者我们可以复制这个命令到我们当前的命令行,来进一步编辑它,输入 Ctrl+j。
复制它,输入 Ctrl+j:
[c.biancheng.net]$ ls -l /usr/bin > ls-output.txt
我们的 shell 提示符重新出现,命令行加载完毕,正准备行动!下表列出了一些按键组合,这些按键用来操作历史列表。
按键 | 作用 |
---|---|
Ctrl+p | 移动到上一个历史条目。类似于上箭头按键。 |
Ctrl+n | 移动到下一个历史条目。类似于下箭头按键。 |
Alt+< | 移动到历史列表开头。 |
Alt+> | 移动到历史列表结尾,即当前命令行。 |
Ctrl+r | 反向递增搜索。从当前命令行开始,向上递增搜索。 |
Alt+p | 反向搜索,不是递增顺序。输入要査找的字符串,然后按下 Enter,执行搜索。 |
Alt+n | 向前搜索,非递增顺序。 |
Ctrl+o | 执行历史列表中的当前项,并移到下一个。如果你想要执行历史列表中一系列的命令,这很方便。 |
历史命令展开
通过使用!字符,shell 为历史列表中的命令,提供了一个特殊的展开类型。我们已经知道一个感叹号,其后再加上一个数字,可以把来自历史列表中的命令插入到命令行中。还有一些其它的展开特性:
应该小心谨慎地使用“!string” 和“!?string” 格式,除非你完全确信历史列表条目的内容。
在历史展开机制中,还有许多可利用的特点,但是这个题目已经太晦涩难懂了,如果我们再继续讨论的话,我们的头可能要爆炸了。 bash 手册页的 HISTORY EXPANSION 部分详尽地讲述了所有要素。
扩展阅读
除了 bash 中的命令历史特性,许多 Linux 发行版包括一个叫做 script 的程序,这个程序可以记录整个 shell 会话,并把 shell 会话存
在一个文件里面。这个命令的基本语法是:
script [file]
命令中的 file 是指用来存储 shell 会话记录的文件名。如果没有指定文件名,则使用文件 typescript。查看脚本的手册页,可以得到一
个关于 script 程序选项和特点的完整列表。