文章目录
UNIX经常被戏称为“为喜欢敲键盘的人设计的操作系统”,当然UNIX中存在命令行的这一事实充分证明了这点。但是用户使用命令行时往往不喜欢敲入太多字,所以命令中存在很多类似cp、ls、mv和rm的短命令。
事实上,省事(laziness)(即用最少的击键次数执行更多的任务)是命令行最希望达到的目标之一。命令行的另一个目标是,用户在执行任务时手指无需离开键盘,更不需要使用鼠标。
1、编辑命令行
bash使用了一个名为Readline的库(供不同的应用程序共享使用的线程集合)来实现命令行的编辑。比如通过箭头键移动光标。除此之外,bash还有很多其他的功能,它们可以当作在工作中使用的附加工具。
1.1、光标移动
光标移动命令
组合键 | 作用 |
Ctrl-A | 移动光标到行首 |
Ctrl-E | 移动光标到行尾 |
Ctrl-F | 光标向前移动一个字符,和右箭头作用一样 |
Ctrl-B | 光标向后移动一个字符,和左箭头作用一样 |
Alt-F | 光标向前移动一个字 |
Alt-B | 光标向后移动一个字 |
Ctrl-L | 清屏并把光标移到左上角;clear命令可以完成相同的工作 |
1.2、修改文本
文本编辑命令
组合键 | 作用 |
Ctrl-D | 删除光标处的字符 |
Ctrl-T | 使光标处的字符和它前面的字符对调位置 |
Alt-T | 使光标处的字和它前面的字对调位置 |
Alt-L | 把从光标到字尾的字符转换成小写字母形式 |
Alt-U | 把从光标到字尾的字符转换成大写字母形式 |
1.3、剪切和粘贴(Killing and Yanking)文本
Readline文档中使用术语killing和yanking来指代通常所说的剪切和粘贴。被剪切的内容存放在一个称为kill-ring的缓冲区中。
组合键 | 作用 |
Ctrl-K | 剪切从光标到行尾的文本 |
Ctrl-U | 剪切从光标到行首的文本 |
Alt-D | 剪切从光标到当前词尾的文本 |
Alt-Backspace | 剪切从光标到词头的文本。如果光标在一个单词的开头,则剪切前一个单词 |
Ctrl-Y | 把kill-ring缓冲区中的文本粘贴 |
2、自动补齐功能
shell的一种称为“自动补齐”的机制为用户提供了很大的帮助。在输入命令时按Tab键将触发自动补齐功能。
如果当前路径存在与所敲前缀匹配的文件或文件夹,此时按下Table键,就会自动补全。如果不存在,按下Table键,则只会出现哔哔声。
此外,如果存在模棱两可的前缀,自动补齐功能是不生效的,例如ls M
,然后按Table,因为当前路径下存在多个以D打头的文件夹,此时编辑器不知道该补齐哪个,所以自动补齐 功能会失效。
自动补齐命令
组合键 | 作用 |
Alt-$ | 显示所有可能的自动补齐列表。在大多数系统中,可通过按两次Tab键实现 |
Alt-* | 插入所有可能的匹配项 |
除了以上这些,还有相当多的组个键,可以在bash man页面的READLINE部分获取更多的相关内容列表。
3、使用历史命令
bash会保存使用过命令的历史记录,这些命令的历史记录列表保存在用户主目录的.bash_history
文件中。这些历史记录非常有用,可以大大减少用户敲打键盘的次数,特别是和命令行编辑组合使用的时候。
3.1、搜索历史命令
任何情况下,我们都可以通过如下命令查看历史记录的内容列表:
bash默认会保存用户最近使用过的500个命令。其中,500是个默认值。
假设我们想找到用来列出/usr/bin目录下内容的命令,我们可以这样做:
历史记录命令
组合键 | 作用 |
Ctrl-P | 移动到前一条历史记录,相当于向上箭头键 |
Ctrl- N | 移动到后一条历史记录,相当于向下剪头键 |
Alt- < | 移动到历史记录列表的开始处 |
Alt- > | 移动到历史记录列表的结尾处,即当前命令行 |
Ctrl-R | 逆向递增地搜索。从当前命令向前递增搜索 |
Alt- P | 逆向非递增地搜索。按下这个组合键,接着输入待搜索的字符串,再按Enter键,搜索才真正开始执行 |
Alt- N | 向前非递增地搜索 |
Ctrl- O | 执行历史记录列表中的当前项,执行完调到下一项。若要把历史记录中的一系列命令重新执行一遍,使用该组合键将很方便 |
Ctrl- J | 用组合键Ctrl-R查找到内容时用这个组合键将命令复制到当前命令行以便进一步的编辑 |
3.2、历史记录扩展
shell提供了一种专门用来扩展历史记录项的方式–使用!字符。例如:
通过查找历史记录获知命令在历史记录中的行数,然后就可以使用!
将!89
扩展为历史列表中第89行的内容。
历史记录扩展命令
序列 | 行为 |
!! | 重复最后一个执行命令。按向上箭头键在按Enter键也可以实现相同的功能 |
!number | 重复历史记录中第number行的命令 |
! string | 重复最近的以string开头的历史记录 |
!?string | 重复最近的包含string的历史记录 |