省事(即用最少的击键次数执行最多的任务)是命令行最希望达到的目标之一。
命令行的另一目标是:用户在执行任务时手指无需离开键盘,不使用鼠标。
接下来让我们认识下令键盘使用得更快、更高效的 bash 功能。
本章将使用到以下命令:
- clear: 清屏。
- history: 显示历史列表的记录。
一、编辑命令行
bash 使用了一个名为 Readline 的库(供不同的应用程序共享使用的线程集合)来实现命令行的编辑。
在之前也曾提到过相关的内容,比如:通过箭头键移动光标。除此之外,bash还有很多其它功能,它们可以当作在工作中使用的附加工具。虽然并不要求学会所有这些功能,但是学会其中的一些功能还是非常有用的。
注意
下面有些组合键(尤其是对于那些使用了 Alt 键的组合键)可能会被图形用户界面识别为其它功能。
但当使用虚拟控制台时,所有的组合键应能正常工作。
1.光标移动
用来移动光标的组合键。
(1)光标移动命令
组合键 | 作用 |
---|---|
Ctrl-A | 移动光标到行首。 |
Ctrl-E | 移动光标到行尾。 |
Ctrl-F | 光标向前移动一个字符(和右箭头键作用一样)。 |
Ctrl-B | 光标向后移动一个字符(和左箭头键作用一样)。 |
Alt-F | 光标向前移动一个字。 |
Alt-B | 光标向后移动一个字。 |
Ctrl-L | 清屏并把光标移到左上角(clear 命令可以完成相同的工作)。 |
2.修改文本
用来编辑命令行字符的键盘指令。
(1)文本编辑命令
组合键 | 作用 |
---|---|
Ctrl-D | 删除光标处的字符。 |
Ctrl-T | 使光标处的字符和它前面的字符对调位置。 |
Alt-T | 使光标处的字和它前面的字对调位置。 |
Alt-L | 把从光标到字尾的字符转换成小写字母形式。 |
Alt-U | 把从光标到字尾的字符转换成大写字母形式。 |
3.剪切和粘贴文本
Readline 文档中使用术语 killing 和 yanking 来指代通常所说的剪切和粘贴。
被剪切的内容存放在一个称为 kill-ring 的缓冲区中。
(1)剪切和粘贴命令
组合键 | 作用 |
---|---|
Ctrl-K | 剪切从光标到行尾的文本。 |
Ctrl-U | 剪切从光标到行首的文本。 |
Alt-D | 剪切从光标到当前词尾的文本。 |
Alt-Backspace | 剪切从光标到词头的文本。如果光标在一个单词的开头,则剪切前一个单词。 |
Ctrl-Y | 把 kill-ring 缓冲区中的文本粘贴到光标位置。 |
二、自动补齐功能
shell 的一种称为“ 自动补齐 ” 的机制为用户提供了很大的帮助。
(1)怎么做?
在输入命令时,按 Tab 键将触发自动补齐功能。
示例
例1
ls
# 查看当前工作目录
假设当前工作目录中含有 ls-output.txt 文件,输入如下命令,但是不要按 Enter 键。
ls l
# 参数不输入完整。
此时按 Tab 键。
# 会出现如下结果:
ls ls-output.txt
# 自动补齐机制会自动将参数补全。
观察 shell 是如何补齐这一行的。
例2
假设当前工作目录中含有多个 D 开头的文件(Desktop、Documents),输入如下命令,但是不要按 Enter 键。
ls D
# 参数不输入完整。
此时按 Tab 键。
# 无变化
ls D
没有自动补齐,只有哔哔声。这是因为字母 D 和目录中一个以上的名称匹配。
要让自动补齐功能生效,必须保证输入内容不能模棱两可(即必须是确定性的)。
# 若输入以下内容:
ls Do
# 按下Tab键,会出现:
ls Documents
# 自动补齐功能生效了
(2)应用
以上例子给出的是路径名的自动补齐,这也是最常用的方式。
自动补齐也可以针对
变量(如果单词以 $ 开头)、
用户名(如果单词以 ~ 开头)、
命令(如果单词是命令行的第一个单词)、
主机名(如果单词以 @ 开头,注意:只对 /etc/hosts 目录下的主机名生效)
起作用。
(3)自动补齐命令
有一些控制和元键序列 与 自动补齐功能相关联。
组合键 | 作用 |
---|---|
Alt-$ | 显示所有可能的自动补齐列表。在大多数系统中,可通过按两次 Tab 键实现,而且也会更容易一些。 |
Alt-* | 插入所有可能的匹配项。当需要用到一个以上的匹配项时,将比较有用。 |
除了以上这些,还有很多组合键可以在 bash man页面的 READLINE 部分获取更多的相关内容列表。
三、使用历史命令
第 1 章已经提到,bash 会保存使用过的命令 的历史记录。
这些命令的历史记录列表保存在用户主目录的 .bash_history 文件中。
这些历史记录非常有用,可以大大减少用户敲打键盘的次数,特别是和命令行编辑结合使用的时候。
1.搜索历史命令
(1)查看历史记录列表
任何情况下,我们都可以通过如下命令查看历史记录的内容列表。
history | less
bash 默认会保存用户最近使用过的 500 个命令。
其中,500 是个默认值,关于如何改变这个默认值将在第 11 章介绍。
示例
假设想找到用来列出 /usr/bin 目录下内容的命令,可以进行如下操作:
history | grep /usr/bin
# 假设得到以下命令
99 ls -l /usr/bin > ls-output.txt
(2)历史记录扩展
数字 99 表示这个命令行在历史记录列表中所处的行号,我们可以通过使用名为历史记录扩展的扩展类型来立即使用它。
① 语法格式
!行号
示例
!99
bash 将把 !99 扩展为历史列表中第 99 行的内容。
② 支持递增地搜索
bash 也支持以逆向递增的方式搜索历史记录(也就是说,当搜索历史记录时,随着输入字符数的增加,bash 会相应地改变搜索范围)。
按下 Ctrl-R 键,接着输入想要查找的内容,可以开始逆向递增式地搜索,当查找到想要的内容时,按 Enter 键表示执行此命令。
而按下 Ctrl-J 键,将把搜索到的内容从历史记录列表中复制到当前命令行。
当要查找下一个匹配项时(即继续向过去搜索历史记录),再次按下 Ctrl-R 键。
若想要退出搜索,按下 Ctrl-G 或 Ctrl-C 即可。
示例
首先,按下 Ctrl-R 。提示符发生改变,提示正在进行逆向递增式搜索。
称为“ 逆向 ” 是因为查找的是从 “ 现在 ” 到 “ 过去 ” 的某个时间之间的操作。
接着,输入要查找的内容,比如查找 /usr/bin。
假设搜索到了,返回了结果。此时我们可以按 Enter 键执行搜索结果,也可按下 Ctrl-J ,把搜索结果复制到当前命令行。
shell 将实时响应,命令行将被加载,准备运行。
(3)历史记录命令
一些用来手动操作历史记录的组合键。
组合键 | 作用 |
---|---|
Ctrl-P | 移动到前一条历史记录(相当于向上箭头键)。 |
Ctrl-N | 移动到后一条历史记录(相当于向下箭头键)。 |
Alt-< | 移动到历史记录列表的开始处。 |
Alt-> | 移动到历史记录列表的结尾处。即当前命令行 |
Ctrl-R | 逆向递增地搜索。从当前命令行向前递增搜索。 |
Alt-P | 逆向非递增地搜索。按下这个组合键,接着输入待搜索的字符串,再按下 Enter 键后,搜索才真正开始执行。 |
Alt-N | 向前非递增地搜索。 |
Ctrl-O | 执行历史记录列表中的当前项,执行完跳到下一项。若要把历史记录中的一系列命令重新执行一遍,使用该组合键将很方便。 |
2.历史记录扩展
shell 提供了一种专门用来扩展历史记录项的方式——使用 ! 字符。前面我们曾提到过,如何通过在感叹号后面跟数字的方式,将来自历史记录列表中的命令插入到命令行中。除了这种方式,还有很多其它的扩展特性。具体如下:
(1)历史记录扩展命令
序列 | 行为 |
---|---|
!! | 重复最后一个执行的命令(按 向上箭头键 再按 Enter 键也可以实现相同的功能,而且操作更简单)。 |
!number | 重复历史记录中第 number 行的命令。 |
! string | 重复最近的以 string 开头的历史记录。 |
!?string | 重复最近的包含 string 的历史记录。 |
(2)谨慎使用 “ ! string ” 和 “ !?string ”
当使用 “ ! string ” 和 “ !?string ” 时,请务必小心谨慎,除非对历史记录中的内容非常确信。
(3)其它的可用特点
历史记录扩展机制中还有很多其它的可用特点,但是该主题太过晦涩难懂,此处不再讨论。可以查阅 bash 帮助页面中的 “ HISTORY EXPANSION ” 部分获取更多细节。
四、本章结尾语
本章介绍了 shell 提供的一些键盘操作技巧,它们能够帮助打字员减少工作量。随着时间的推移,你会越来越多地接触到命令行。通过学习本章内容,可以获得更多的键盘使用技巧。
网友评论