第八章-先进的键盘技巧<The Linux Command Line A Complete Introduction>

一.学习内容

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键时发生补全。让我们看看它是如何工作的。给定一个像这样的主目录:


[me@linuxbox ~]$ ls
Desktop ls-output.txt Pictures Templates Videos
Documents Music Public

2.试着输入以下内容,但不要按回车键:

[me@linuxbox ~]$ ls l

3.现在按tab键。


[me@linuxbox ~]$ ls ls-output.txt
4.看到外壳如何为您完成这条线了吗?我们再试一个。
同样,不要按回车键。
[me@linuxbox ~]$ ls D
5.按TAB键
[me@linuxbox ~]$ ls D
6.没有完成,什么都没有。发生这种情况是因为D匹配目录中的多个条目。为了成功完成游戏,你所提供的“线索”必须是明确的。如果我们更进一步,如下所示:
[me@linuxbox ~]$ ls Do
7.然后按tab键:
[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
3.默认情况下,bash存储我们输入的最后500个命令,尽管大多数现代发行版将这个值设置为1,000。我们将在第11章看到如何调整这个值。假设我们想要找到我们用来列出/usr/bin的命令。这是一种方法:
[me@linuxbox ~]$ history | grep /usr/bin
4.假设在我们的结果中有一行包含这样一个有趣的命令:
88 ls -l /usr/bin > ls-output.txt
5.88为命令在历史记录列表中的行号。我们可以马上用另一种形式的展开叫做历史展开。
要使用我们发现的行,我们可以这样做:
[me@linuxbox ~]$ !88
6.Bash将把!88展开为历史列表中第88行的内容。
我们将在下一节介绍其他形式的历史扩展。
Bash还提供了增量搜索历史列表的功能。

这意味着我们可以告诉bash在输入字符时搜索历史列表,每增加一个字符将进一步优化我们的搜索。要开始增量搜索,按ctrl-R,后面跟着要查找的文本。找到它后,可以按enter键执行该命令,也可以按ctrl-J键将该行从历史列表复制到当前命令行。
要查找文本的下一个出现位置(将历史列表“上移”),请再次按ctrl-R。按ctrl-G或ctrl-C退出搜索。在这里我们看到它的作用:
[me@linuxbox ~]$
7.首先按ctrl-R。
(reverse-i-search)`':
8.提示符的变化表明我们正在执行反向增量搜索。之所以是“反向”,是因为我们正在从“现在”搜索到过去的某个时间。接下来,我们开始输入搜索文本。在这个例子中,我们正在搜索/usr/bin:
(reverse-i-search )`/usr/bin': ls -l /usr/bin > ls-output.txt
9.搜索立即返回我们的结果。有了结果,我们可以按enter键来执行命令,或者按ctrl-J键将命令复制到当前命令行以进行进一步编辑。我们复制一下。新闻ctrl-J
[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt
10.我们的shell提示符返回,并且我们的命令行已加载并准备好执行操作!
表8-5列出了一些用于操作历史列表的按键。
表8-5:                      历史命令
ctrl-P                            移动到上一个历史记录项。这与向上箭头的动作相同。
ctrl-N                       移动到下一个历史记录项。这与向下箭头的动作相同。
alt-<                        移动到历史记录列表的开始(顶部)。
alt->                        移动到历史列表的末尾(底部),即当前命令行。
ctrl-R                      反向增量搜索。这将从当前命令行开始逐步搜索历史列表。

alt
-P                       反向搜索,非增量。使用此键,在执行搜索之前键入搜索字符串并按enter键。
alt-N                        前向搜索,非增量。
ctrl-O                       执行历史记录列表中的当前项,并进入下一个项。如果您试图重新执行历史列表中的命令序列,这将非常方便。

六.历史扩展


1.shell为历史列表中的项提供了一种特殊类型的扩展,使用!的性格。我们已经看到了如何在感叹号后面跟一个数字,以从历史列表中插入一个条目。还有许多其他的扩展特性,如表8-6所示。

表8-6:                  历史扩容命令
序列                                   行动
!!                                重复最后一个命令。按向上箭头并输入可能更容易。
!number                                    重复历史记录列表项目编号。
!string                                重复以string开头的最后一个历史列表项。
!?                                重复上次包含字符串的历史列表项。


2.我警告不要使用!字符串和!?字符串形式,除非您绝对确定历史列表项的内容。
在历史扩展机制中有更多的元素可用,但这个主题已经太神秘了,如果我们继续下去,我们的头可能会爆炸。bash手册页的“HISTORY EXPANSION”部分详细介绍了所有的细节。尽情探索吧!

3.脚本
除了bash中的命令历史特性之外,大多数Linux发行版还包括一个名为script的程序,该程序可用于记录整个shell会话并将其存储在文件中。该命令的基本语法如下:

script file
4.其中file为存放录音文件的文件名。如果没有指定文件,则使用文件类型脚本。有关该程序的选项和特性的完整列表,请参阅脚本手册页。

七.总结

在本章中,我们介绍了shell提供的一些键盘技巧,以帮助铁杆打字员减少他们的工作量。随着时间的推移,我们对命令行越来越熟悉,我们可以参考本章来学习更多这些技巧。现在,把它们看作是可选的和可能有用的。

相关推荐

  1. django

    2023-12-07 05:32:05       64 阅读
  2. 华为HCIE课堂笔记 SR技术

    2023-12-07 05:32:05       46 阅读
  3. 排序 各种排序算法比较

    2023-12-07 05:32:05       46 阅读
  4. 行政法学-:特殊类型行政行为

    2023-12-07 05:32:05       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-07 05:32:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-07 05:32:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-07 05:32:05       82 阅读
  4. Python语言-面向对象

    2023-12-07 05:32:05       91 阅读

热门阅读

  1. 解决 video.js ios 播放一会行一会不行

    2023-12-07 05:32:05       60 阅读
  2. 微信小程序中全局变量的应用

    2023-12-07 05:32:05       56 阅读
  3. 【Android】Glide的简单使用(下)

    2023-12-07 05:32:05       50 阅读
  4. JPA构建多条件查询

    2023-12-07 05:32:05       59 阅读
  5. 浅谈深度学习中的过拟合

    2023-12-07 05:32:05       52 阅读
  6. EasyExcel下拉列表长度过长不显示【已修复】

    2023-12-07 05:32:05       76 阅读
  7. 第3节:Vue3 v-bind指令

    2023-12-07 05:32:05       61 阅读
  8. 【flink】基于flink全量同步postgres表到doris

    2023-12-07 05:32:05       57 阅读
  9. Stream流

    Stream流

    2023-12-07 05:32:05      47 阅读
  10. 算法工程师-机器学习面试题总结(4)

    2023-12-07 05:32:05       47 阅读
  11. golang学习笔记——go互斥锁

    2023-12-07 05:32:05       68 阅读
  12. (二)回测框架之策略Mocker

    2023-12-07 05:32:05       52 阅读