开玩笑地说,我经常把 Unix 描述为“这个操作系统是为喜欢敲键盘的人们服务的。”当
然,Unix 甚至还有一个命令行,这个事实是个确凿的证据,证明了我所说的话。但是命令行用
户不喜欢敲入那么多字。那又为什么如此多的命令会有这样简短的命令名,像 cp,ls,mv,和
rm?事实上,命令行最为珍视的目标之一就是懒惰;用最少的击键次数来完成最多的工作。另
一个目标是你的手指永远不必离开键盘,永不触摸鼠标。在这一章节,我们将看一下 bash 特
性,这些特性使键盘使用起来更加迅速,更加高效。
Bash 使用了一个名为 Readline 的库(共享的线程集合,可以被不同的程序使用),来实现
命令行编辑。我们已经看到一些例子。我们知道,例如,箭头按键可以移动鼠标,此外还有许
多特性。想想这些额外的工具,我们可以在工作中使用。学会所有的特性并不重要,但许多特
性非常有帮助。选择自己需要的特性。
注意:下面一些按键组合(尤其使用 Alt 键的组合),可能会被 GUI 拦截来触发其它的功
能。当使用虚拟控制台时,所有的按键组合都应该正确地工作。
移动光标
修改文本
剪切和粘贴文本
Readline 的文档使用术语 killing 和 yanking 来指我们平常所说的剪切和粘贴。剪切下来的
本文被存储在一个叫做剪切环 (kill-ring) 的缓冲区中。
自动补全
shell 能帮助你的另一种方式是通过一种叫做自动补全的机制。当你敲入一个命令时,按下
tab 键,自动补全就会发生。让我们看一下这是怎样工作的。给出一个看起来像这样的主目录
自动补全成功了。
这个实例展示了路径名自动补全,这是最常用的形式。自动补全也能对变量起作用(如果
字的开头是一个 “$”),用户名字(单词以”~” 开始),命令(如果单词是一行的第一个单词),
和主机名(如果单词的开头是 “@”)。主机名自动补全只对包含在文件/etc/hosts 中的主机名有
效。
有一系列的控制和元键序列与自动补全相关联
可编程自动补全
目前的 bash 版本有一个叫做可编程自动补全工具。可编程自动补全允许你(更
可能是,你的发行版提供商)来加入额外的自动补全规则。通常需要加入对特定应
用程序的支持,来完成这个任务。例如,有可能为一个命令的选项列表,或者一个
应用程序支持的特殊文件类型加入自动补全。默认情况下,Ubuntu 已经定义了一
个相当大的规则集合。可编程自动补全是由 shell 函数实现的,shell 函数是一种小
巧的 shell 脚本,我们会在后面的章节中讨论到。如果你感到好奇,试一下:
set | less
查看一下如果你能找到它们的话。默认情况下,并不是所有的发行版都包括它们。
利用历史命令
正如我们在第二章中讨论到的,bash 维护着一个已经执行过的命令的历史列表。这个命令
列表被保存在你主目录下,一个叫做.bash history 的文件里。这个 history 工具是个有用资源,
因为它可以减少你敲键盘的次数,尤其当和命令行编辑联系起来时。
搜索历史命令
在任何时候,我们都可以浏览历史列表的内容,通过:
提示符改变,显示我们正在执行反向递增搜索。搜索过程是 “反向的”,因为我们按照从”
现在” 到过去某个时间段的顺序来搜寻。下一步,我们开始输入要查找的文本。在这个例子里
是 “/usr/bin”
历史命令展开
通过使用 “!” 字符,shell 为历史列表中的命令,提供了一个特殊的展开类型。我们已经知
道一个感叹号,其后再加上一个数字,可以把来自历史列表中的命令插入到命令行中。还有一
些其它的展开特性:
应该小心谨慎地使用 “!string” 和 “!?string” 格式,除非你完全确信历史列表条目的内容。
在历史展开机制中,还有许多可利用的特点,但是这个题目已经太晦涩难懂了,如果我们
再继续讨论的话,我们的头可能要爆炸了。bash 手册页的 HISTORY EXPANSION 部分详尽
地讲述了所有要素。
脚本
除了 bash 中的命令历史特性,许多 Linux 发行版包括一个叫做 script 的程序,
这个程序可以记录整个 shell 会话,并把 shell 会话存在一个文件里面。这个命令的
基本语法是:
script [file]
命令中的 file 是指用来存储 shell 会话记录的文件名。如果没有指定文件名,则
使用文件 typescript。查看脚本的手册页,可以得到一个关于 script 程序选项和特
点的完整列表。