一.学习内容
1.我经常开玩笑地把Unix描述为“喜欢打字的人的操作系统”。当然,它甚至有一个命令行就是证明;然而,命令行用户不喜欢输入那么多。
2.否则为什么这么多命令都有这么短的名字,比如cp、ls、mv和rm?事实上,命令行最值得珍视的目标之一就是懒惰——用最少的按键完成最多的工作。另一个目标是永远不用把手指从键盘上移开去触碰鼠标。在本章中,我们将研究使键盘使用更快、更有效的bash特性。
3.将出现以下命令:
clear 清除终端屏幕
history 显示或操作历史列表
二.命令行编辑
1.bash使用一个名为Readline的库(不同程序可以使用的共享例程集合)来实现命令行编辑。我们已经看到了其中的一些。例如,我们知道方向键可以移动光标,但还有更多的功能。把这些看作是我们可以在工作中使用的额外工具。学习所有这些并不重要,但其中许多是非常有用的。根据需要挑选。
2.本章中涉及的一些键序列(特别是那些使用alt键的键)可能会被GUI截获以用于其他功能。当使用虚拟控制台时,所有的键序列都应该正常工作。
3.光标移动
光标移动的关键键说明如表8-1所示。
表8-1 光标移动命令
ctrl-A 将光标移动到行首。
ctrl-E 将光标移动到行尾。
ctrl-F 将光标向前移动一个字符;与右箭头键相同。
ctrl-B 将光标向后移动一个字符;与左方向键相同。
alt-F 将光标向前移动一个单词。
alt-B 将光标向后移动一个单词。
ctrl-L 清除屏幕并将光标移动到左上角。clear命令做同样的事情。
三.修改尺寸文字
1.因为在编写命令时可能会出错,所以我们需要一种有效地纠正它们的方法。在命令行中编辑字符的键盘命令如表8-2所示。
表8-2:文本编辑命令
键 动作
ctrl-D 删除光标位置的字符。
ctrl-T 将光标所在位置的字符与其前面的字符调换。
alt-T 将光标所在位置的单词与其前面的单词调换。
alt-L 将光标位置到单词末尾的字符转换为小写。
alt-U 转换字符
2.Cutting and Pasting (Killing and Yanking) Text
3.Readline文档使用术语kill和yanking来指代我们通常所说的剪切和粘贴(见表8-3)。被切断的项目被存储在一个称为kill-ring的缓冲区(内存中的临时存储区域)中。
表8-3:剪切粘贴命令
键 操作
ctrl-K 终止从光标位置到行尾的文本。
ctrl-U 终止从光标位置到行首的文本。
alt-D 删除从光标位置到当前单词末尾的文本。
alt-backspace 终止从光标位置到当前单词开头的文本。如果光标位于单词的开头,则删除前一个单词。
ctrl-Y 从终止环中拔出文本并将其插入光标位置。
4.The Meta Key
4.1如果您冒险进入Readline文档,可以在
在bash手册页的" READLINE "部分,您将遇到术语元键。在现代键盘上,这映射到alt键;然而,情况并非总是如此。
4.2 回到黑暗的时代(在个人电脑之前,但在Unix之后),并不是每个人都有自己的电脑。他们可能拥有一种叫做终端的设备。终端是一种通信设备,它的特点是有一个文本显示屏幕和一个键盘,里面有足够的电子设备来显示文本字符和移动光标。它被连接(通常通过串行电缆)到大型计算机或大型计算机的通信网络上
4.3 有许多不同品牌的终端,它们都有不同的键盘和显示功能集。因为他们都倾向于至少理解ASCII,所以软件开发人员希望编写符合最低公分母的可移植应用程序。Unix系统有一种复杂的方法来处理终端及其不同的显示特性。因为Readline的开发人员不能确定是否存在一个专用的额外控制键,所以他们发明了一个,并称之为meta。当alt键在现代键盘上充当元键时,如果你仍然在使用终端,你也可以按下并释放esc键来获得与按住alt键相同的效果(你仍然可以在Linux中这样做!)
四.Completion
1.shell可以帮助您的另一种方式是通过称为补全的机制。当您在键入命令时按tab键时发生补全。让我们看看它是如何工作的。给定一个像这样的主目录:
2.试着输入以下内容,但不要按回车键:
[me@linuxbox ~]$ ls l
3.现在按tab键。
[me@linuxbox ~]$ ls ls-output.txt
同样,不要按回车键。
[me@linuxbox ~]$ ls D
[me@linuxbox ~]$ ls D
[me@linuxbox ~]$ ls Do
[me@linuxbox ~]$ ls Documents
8.完成成功。
虽然这个例子展示了路径名的补全,这是它最常见的用法,但补全也适用于变量(如果单词的开头是$)、用户名(如果单词以~开头)、命令(如果单词是该行的第一个单词)和主机名(如果单词的开头是@)。
主机名补全只适用于/etc/hosts.中列出的主机名
一些控制键和元键序列与补全相关,如表8-4所示。
表8-4:完成命令
关键 动作
alt-? 显示可能完成的列表。在大多数系统中,您还可以通过再次按tab键来完成此操作,这要简单得多。
alt-* 插入所有可能的补全。当您希望使用多个可能的匹配项时,这很有用。
还有一些是相当模糊的。在bash手册页的“READLINE”下会出现一个列表。
9.可编程完成
最新版本的bash有一个称为可编程完成的功能。
可编程完成允许您(或者更可能是您的分发提供商)添加更多的完成规则。通常这样做是为了增加对特定应用程序的支持。例如,可以为命令的选项列表添加补全功能,或者匹配应用程序支持的特定文件类型。Ubuntu默认定义了一个相当大的集合。可编程补全是通过shell函数实现的,这是一种迷你shell脚本,我们将在后面的章节中介绍。如果你很好奇,可以试试
set | less
五.使用历史
1.正如我们在第1章中所发现的,bash维护已输入命令的历史记录。这个命令列表保存在主目录中一个名为bash_history的文件中。历史记录功能是一种有用的资源,可以减少必须执行的键入量,特别是在与命令行编辑结合使用时。
2.搜索历史
在任何时候,我们都可以通过以下操作查看命令历史列表的内容:
[me@linuxbox ~]$ history | less
[me@linuxbox ~]$ history | grep /usr/bin
88 ls -l /usr/bin > ls-output.txt
要使用我们发现的行,我们可以这样做:
[me@linuxbox ~]$ !88
我们将在下一节介绍其他形式的历史扩展。
Bash还提供了增量搜索历史列表的功能。
这意味着我们可以告诉bash在输入字符时搜索历史列表,每增加一个字符将进一步优化我们的搜索。要开始增量搜索,按ctrl-R,后面跟着要查找的文本。找到它后,可以按enter键执行该命令,也可以按ctrl-J键将该行从历史列表复制到当前命令行。
要查找文本的下一个出现位置(将历史列表“上移”),请再次按ctrl-R。按ctrl-G或ctrl-C退出搜索。在这里我们看到它的作用:
[me@linuxbox ~]$
(reverse-i-search)`':
(reverse-i-search )`/usr/bin': ls -l /usr/bin > ls-output.txt
[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt
表8-5列出了一些用于操作历史列表的按键。
ctrl-P 移动到上一个历史记录项。这与向上箭头的动作相同。
ctrl-N 移动到下一个历史记录项。这与向下箭头的动作相同。
alt-< 移动到历史记录列表的开始(顶部)。
alt-> 移动到历史列表的末尾(底部),即当前命令行。
ctrl-R 反向增量搜索。这将从当前命令行开始逐步搜索历史列表。
alt -P 反向搜索,非增量。使用此键,在执行搜索之前键入搜索字符串并按enter键。
六.历史扩展
1.shell为历史列表中的项提供了一种特殊类型的扩展,使用!的性格。我们已经看到了如何在感叹号后面跟一个数字,以从历史列表中插入一个条目。还有许多其他的扩展特性,如表8-6所示。
表8-6: 历史扩容命令
序列 行动
!! 重复最后一个命令。按向上箭头并输入可能更容易。
!number 重复历史记录列表项目编号。
!string 重复以string开头的最后一个历史列表项。
!? 重复上次包含字符串的历史列表项。
2.我警告不要使用!字符串和!?字符串形式,除非您绝对确定历史列表项的内容。
在历史扩展机制中有更多的元素可用,但这个主题已经太神秘了,如果我们继续下去,我们的头可能会爆炸。bash手册页的“HISTORY EXPANSION”部分详细介绍了所有的细节。尽情探索吧!
3.脚本
除了bash中的命令历史特性之外,大多数Linux发行版还包括一个名为script的程序,该程序可用于记录整个shell会话并将其存储在文件中。该命令的基本语法如下:
script file