UNIX常被戏称为“它是为喜欢敲键盘的人设计的操作系统”。当然,UNIX中存在命令行的这一事实充分证明了这一点。但是用户使用命令行时往往不喜欢敲入太多字,所以命令中存在很多类似ls、cp、mv和rm等的短命令。
事实上,省事(laziness)(即用最少的击键次数执行最多的任务)是命令行最希望达到的目标之一。命令行的另一个目标是用户在执行任务时手指无需离开键盘,不使用鼠标。
我们将使用到以下命令:
1.clear:清屏
2.history:显示历史列表的记录
1.编辑命令行
bash使用了一个名为Readline的库(供不同的应用程序共享使用的线程集合)来实现命令行的编辑。
比如,通过箭头键移动光标。除此之外,bash还有很多其他功能,它们可以当做在工作中使用的附加工具。
(1)光标移动
下表列出了用来移动光标的组合键
组合键 | 作用 |
---|---|
Ctrl-A | 移动光标到行首 |
Ctrl-E | 移动光标到行尾 |
Ctrl-F | 光标向前移动一个字符,和右箭头键作用一样 |
Ctrl-B | 光标向后移动一个字符,和左箭头键作用一样 |
Alt-F | 光标向前移动一个字 |
Alt-B | 光标向后移动一个字 |
Ctrl-L | 清屏并把光标移到左上角;clear命令可以完成相同的工资 |
(2)修改文本
下表列出了用来编辑命令行字符的键盘命令
组合键 | 作用 |
---|---|
Ctrl-D | 删除光标处的字符 |
Ctrl-T | 使光标处的字符和它前面的字符对调位置 |
Alt-T | 使光标处的字和它前面的字对调位置 |
Alt-L | 把从光标到字尾的字符转换成小写字母的形式 |
Alt-U | 把从光标到字尾的字符转换成大写字母的形式 |
(3)剪切和粘贴(Killing and Yanking)文本
Readline文档中使用术语killing和yanking来指代通常所说的剪切和粘贴,下表列出了用来剪切和粘贴的命令。被剪切的内容存放在一个称为kill-ring的缓冲区中
组合键 | 作用 |
---|---|
Ctrl-K | 剪切从光标到行尾的文本 |
Ctrl-U | 剪切从光标到行首的文本 |
Alt-D | 剪切从光标到当前词尾的文本 |
Alt-Backspace | 剪切从光标到词头的文本。如果光标在一个单词的开头,则剪切前一个单词 |
Ctrl-Y | 把kill-ring缓冲区中的文本粘贴到光标位置 |
2.自动补齐功能
shell的一种称为“自动补齐”的机制为用户提供了很大的帮助。在输入命令时,按Tab键将触发自动补齐功能。下面让我们看看它是如何工作的。假设用户目录如下:
输入如下命令,但是不要按Enter键
ls P
此时按Tab键
观察shell是如何补齐这一行的。再看另一个例子,同样,也不要Enter键
ls l
按下Tab键
没有自动补齐,只有哔哔声。这是因为字母“l”和目录中一个以上的名称匹配。要让自动补齐功能生效,要保证输入的内容不模棱两可,即必须是确定性的,如果我们继续输入:
此时按下Tab键
自动补齐功能生效了。
这个例子给出的是文件名的自动补齐,这也是常用的方式。自动补齐也可以针对变量(如果单词以$开头)、用户名(如果单词以~开头)、命令(如果单词是命令行的第一个单词)和主机名(如果单词以@开头)起作用。主机名的自动补齐只针对/etc/hosts目录下的主机名生效。
有一些控制和元键序列与自动补齐功能相关联。
组合键 | 作用 |
---|---|
Alt-$ | 显示所有可能的自动补齐列表。在大多数系统中,可通过按两次Tab键实现,而且也会更容易一些 |
Alt-* | 插入所有可能的匹配项。当需要用到一个以上的匹配项时,将比较有用 |
除了以上这些,还有相当多的组合键,可以在bash man页面的READLINE部分获取更多的相关内容列表。
3.使用历史命令
bash会保存使用过命令的历史记录。这些命令的历史记录表保存在用户目录的.bash_history文件中。这些历史记录非常有用,可以大大减少用户敲打键盘的次数,特别是和命令行编辑结合使用的时候。
(1)搜索历史命令
任何情况下,我们都可以通过如下命令查看历史记录的内容列表。
bash默认会保存用户最近使用过的500个命令。其中,500是个默认值。
假设我们想找到用来列出/usr/bin目录下内容的命令,我们可以这样做:
假设得到的搜索结果中有一行包含如下命令
88 ls -l /usr/bin > ls-output.txt
数字88表示这个命令行在历史记录列表中所处的行号,我们可以通过使用名为历史记录扩展(history expansion)的扩展类型来立即使用它。为了使用我们发现的命令行,可以进行如下操作:
!88
bash将把!88扩展为历史列表中88行的内容。
bash也支持以递增方式搜索历史记录。也就是说,当搜索历史记录时,随着输入字符数的增加,bash会相应地改变搜索范围。按下Ctrl-R键,接着输入你要查找的内容,可以开始递增式的搜索。当找到要查找的内容时,按Enter键表示执行此命令,而按下Ctrl-J将把搜索到的内容从历史记录列表中复制到当前命令行。当要查找下一个匹配项时(即向前搜索历史记录), 再次按下Ctrl-R键。若要退出搜索,按下Ctrl-G或者Ctrl-C即可。
首先按下Ctrl-R
提示符发生改变,提示正在进行逆向递增式搜索。称为“逆向”是因为查找的是从“现在”到过去的某个时间之间的操作。
当搜索操作返回了结果,此时我们可按Enter键执行搜索结果,也可按下Ctrl-J把搜索结果复制到当前命令行以便做进一步的编辑。
下面列出了一些手动操作历史记录的组合键
组合键 | 作用 |
---|---|
Ctrl-P | 移动到前一条历史记录,相当于向上箭头。 |
Ctrl-N | 移动到后一条历史记录,相当于向下箭头。 |
Alt-< | 移动到历史记录表的开始处 |
Alt-> | 移动到历史记录表的结尾处,即当前命令行 |
Ctrl-R | 逆向递增地搜索,从当前命令行向前递增搜索。 |
Alt-P | 逆向非递增搜索,按下这个组合键,接着输入待搜索的字符串,在按Enter键后,搜索才真正开始执行 |
Alt-N | 向前非递增地搜索 |
Ctrl-O | 执行历史记录列表中的当前项,执行完跳到下一项。若要把历史记录中的一系列命令重新执行一遍,使用该组合键将很方便 |
(2)历史记录扩展
shell提供了一种专门用来扩展历史记录项的方式,即使用“!”字符。前面我们提到过如何通过在感叹号后面跟数字的方式,将来自历史记录列表中的命令插入到命令行中,除了这种方式,还有很多其他扩展方式。
序列 | 行为 |
---|---|
!! | 重复最后一个执行的命令,按向上箭头键再按Enter键也可实现相同的功能 |
!number | 重复历史记录中第number行的命令 |
!string | 重复最近的以string开头的历史记录 |
!?string | 重复最近的包含string的历史记录 |
当使用“!string”和“!?string”时,请务必小心谨慎,除非对历史记录中的内容非常确信。
(3)脚本
除了bash中的命令历史特性外,大部分Linux发行版本都包含一个称为脚本(script)的程序,它记录了shell的整个会话,并且将会话保存到一个文件中。该命令的语法是:
script [file]
其中file为用来保存会话记录的文件名。如果没有指定文件,默认使用文件typescript。脚本(script)的man页面给出了该程序的所有可选项和特性。