前言##

之前看到一篇介绍 IntelliJ IDEA 装备的文章,它里边用的是 gif 动态图片进行展示,我觉得很不错。所以在我今日以及今后的博文中,我也会尽量运用 gif 动图进行展示。制造 gif 动图很花时间,为了把我的博客打造成精品我也是蛮拼的了。运用动图的优点是演示作用好,缺点是动图体积过大,为了降低图片体积,我只能降低分辨率了。

关于高效运用指令行这个话题,在网上已经是老生常谈了。并且本文也学习了 CSDN 极客头条中引荐了的《像黑客一样运用 Linux 指令行》。可是在本文中,也有不少我自己的观念和体会,比方我会说到有些快捷键要熟记,有些则彻底不需求记,毕竟咱们的记忆力也是有限的,我还会说到一些助记的方法。所以,本文绝对不是照猫画虎,值得咱们拥有,请咱们一定记住点赞。

运用 tmux 复用操控台窗口##

高效运用指令行的首要原则便是要尽量避免横死令行的搅扰,什么意思呢?便是说一但开启了一个操控台窗口,就尽量不要再在桌面上切换来切换去了,不要一瞬间被其他窗口挡住操控台,一瞬间又让其他窗口破坏了操控台的布景,最好是把操控台最大化或全屏,最好连鼠标都不要用。只有这样,才干达到比较高的效率。可是在实践作业中,咱们又常常需求一起在多个操控台中进行作业,例如:在一个操控台中运转录制屏幕的指令,在别的一个操控台中作业,或许在一个操控台中作业,在别的一个操控台中阅读文档。假如既想在多个操控台中作业,又不想一大堆窗口挡来挡去、换来换去的话,就能够考虑试试 tmux 了。如下图:

像黑客一样使用 Linux 命令行

tmux 的功用许多,什么 Session 啊、Detach 啊、Atach 啊什么的咱们暂时不必去关心,只用好它的操控台窗口复用功用就行了。tmux 中有 window 和 pane 的概念,tmux 能够创立多个 window,这些 window 是不会互相遮挡的,每次只显示一个 window,其它的 window 会自动隐藏,能够运用快捷键在 window 之间切换。一起,能够把一个 window 切分红多个 pane,这些 pane 一起显示在屏幕上,能够运用快捷键在 pane 之间切换。

tmux 的快捷键许多,要想全面了解 tmux 的最好办法当然是阅读 tmux 的文档了,运用指令 man tmux 就能够了。可是咱们只需求记住少量几个重要的快捷键就能够了,如下表:

快捷键 功用
Ctrl+B c 创立一个 window
Ctrl+B [n][p] 切换到下一个窗口或上一个窗口
Ctrl+B & 封闭当时窗口
Ctrl+B ” 将当时 window 或 pane 切分红两个 pane,上下摆放
Ctrl+B % 将当时 window 或 pane 切分红两个 pane,左右摆放
Ctrl+B x 封闭当时 pane
Ctrl+B [↑][↓][←][→] 在 pane 之间移动
Ctrl+[↑][↓][←][→] 调整当时 pane 的巨细,一次调整一格
Alt+[↑][↓][←][→] 调整当时 pane 的巨细,一次调整五格

tmux 的快捷键比较特别,除了调整 pane 巨细的快捷键之外,其它的都是先按 Ctrl+B,再按一个字符。先按 Ctrl+B,再按 c,就会创立一个 window,这儿 c 便是 create window。先按 Ctrl+B,再按 n 或许 p,就能够在窗口之间切换,它们是 next window 和 previous window 的意思。封闭窗口是先按 Ctrl+B,再按 &,这个只能死记。先按 Ctrl+B,再按 ” ,表明上下拆分窗口,能够幻想成单引号和双引号在键盘上是上下铺关系。先按 Ctrl+B,再按 % 表明左右拆分窗口,大约是由于百分数都是左右书写的吧。至于在 pane 之间移动和调整 pane 巨细的方向键,就不必多说了吧。

在指令行中快速移动光标##

在指令行中输入指令时,常常要在指令行中移动光标。这个很简单嘛,运用左右方向键就能够了,可是有时分咱们输入了很长一串指令,却突然要修正这个指令最最初的内容,假如运用向左的方向键一个字符一个字符地把光标移到指令的最初,是否太慢了呢?有时咱们需求直接在指令的最初和结束之间切换,有时又需求能够一个单词一个单词地移动光标,在指令行中,其实这都不是事儿。如下图:

像黑客一样使用 Linux 命令行

这几种移动方法都是有快捷键的。其实一个字符一个字符地移动光标也有快捷键 Ctrl+B 和 Ctrl+F,可是这两个快捷键咱们不需求记,有什么能比左右方向键更便利的呢?咱们真正要记的是下面这几个:

快捷键 功用
Ctrl + A 将光标移动到指令行的最初
Ctrl + E 将光标移动到指令行的结束
Alt + B 将光标向左移动一个单词
Alt + F 将光标向右移动一个单词

这几个快捷键太好记了,A 代表 ahead,E 代表 end,B 代表 back,F 代表 forward。为什么按单词移动光标的快捷键都是以 Alt 最初呢?那是由于按字符移动光标的快捷键把 Ctrl 占用了。可是按字符移动光标的快捷键咱们用不到啊,由于咱们有左右方向键啊。

在指令行中快速删去文本##

对输入的内容进行修正也是咱们常常要干的事情,对指令行进行修正就涉及到先删去一部分内容,再输入新内容。咱们碰到的情况是有时分只需求修正单个字符,有时分需求修正单个单词,而有时分,输入了半响的很长的一段指令,咱们说不要就全都不要了,整行删去。常用的删去键当然是 BackSpace 和 Delete 啦,不过一次删去一个字符,是否太慢了呢?那么,请熟记以下几个快捷键吧:

快捷键 功用
Ctrl + U 删去从光标到行首的一切内容,假如光标内行尾,天然就整行都删去了啊
Ctrl + K 删去从光标到行尾的一切内容,假如光标内行首,天然也是整行都删去了啊
Ctrl + W 删去光标前的一个单词
Alt + D 删去光标后的一个单词
Ctrl + Y 将刚删去的内容粘贴到光标处,有时分删错了能够用这个快捷键恢复删去的内容

作用请看下图:

像黑客一样使用 Linux 命令行

这几个快捷键也是蛮好记的,U 代表 undo,K 代表 kill,W 代表 word,D 代表 delete, Y 代表 yank。其间比较奇怪的是 Alt+D 又是以 Alt 最初的,那是由于 Ctrl+D 又被占用了。Ctrl+D 有几个意思,在编辑指令行的时分它代表删去一个字符,当然,这个快捷键其实咱们用不到,由于 BackSpace 和 Delete 便利多了。在某些程序从 stdin 读取数据的时分,Ctrl+D 代表 EOF,这个咱们偶尔会用到。

快速检查和查找前史指令##

对于从前运转过的指令,除非特别短,咱们一般不会重复输入,从前史记录中找出来用天然要快得多。咱们用得最多的便是 ↑ 和 ↓,特别是不久前才刚刚输入过的指令,运用 ↑ 向上翻几行就找到了,按一下 Enter 就履行,多舒畅。可是有时分,明明记住是不久前才用过的指令,可是向上翻了半响也没找到,怎么办?那只好运用 history 指令来检查一切的前史记录了。前史记录又特别长,怎么办?能够运用 history | lesshistory | grep '...'。可是还有终极大杀招,那便是按 Ctrl+R 从前史记录中进行查找。按了 Ctrl+R 之后,每输入一个字符,都会和前史记录中进行增量匹配,输入得越多,匹配越准确。当然,有时分含有相同查找字符串的指令特别多,怎么办?持续按 Ctrl+R,就会持续查找下一条匹配的前史记录。如下图:

像黑客一样使用 Linux 命令行

这儿,需求记住的指令和快捷键如下表:

指令或快捷键 功用
history 检查前史记录
history less 分页检查前史记录
history grep ‘…’ 在前史记录中查找匹配的指令,并显示
Ctrl + R 逆向查找前史记录,和输入的字符进行增量匹配
Esc 中止查找前史记录,并将当时匹配的成果放到当时输入的指令行上
Enter 中止查找前史记录,并将当时匹配的成果当即履行
Ctrl + G 中止查找前史记录,并放弃当时匹配的成果
Alt + > 将前史记录中的方位符号移动到前史记录的尾部

这儿需求留意的是,当咱们在前史记录中查找的时分,是有方位符号的,Ctrl+R 是指从当时方位开端,逆向查找,R 代表的是 reverse,每查找一条记录,方位符号都会向前史记录的头部移动,下次查找又从这儿开端持续向头部查找。所以,咱们一定要记住快捷键 Alt+>,它能够把前史记录的方位符号复原。别的需求留意的是中止查找前史记录的快捷键有三个,假如按 Enter 键,匹配的指令就当即履行了,假如你还想有修正这条指令的机会的话,一定不要按 Enter,而要按 Esc。假如什么都不想要,就按 Ctrl+G 吧,它会还你一个空白的指令行。

快速引证和润饰前史指令##

除了检查和查找前史记录,咱们还能够以更灵活的方法引证前史记录中的指令。常见的简单的比如有 !! 代表引证上一条指令,!$代表引证上一条指令的最终一个参数,^oldstring^newstring^代表将上一条指令中的 oldstring 替换成 newstring。这些操作是咱们平常运用指令行的时分的一些常用技巧,其实它们的实质,是由 history 库供给的 history expansion 功用。Bash 运用了 history 库,所以也能运用这些功用。其完好的文档能够检查 man history 手册页。知道了 history expansion 的理论,咱们还能够做一些更加复杂的操作,如下图:

像黑客一样使用 Linux 命令行

引证和润饰前史指令的完好格式是这样的:

![!|[?]string|[-]number]:[n|x-y|^|$|*|n*|%]:[h|t|r|e|p|s|g]

能够看到,一个对前史指令的引证被 : 分为了三个部分,第一个部分决议了引证哪一条前史指令;第二部分决议了选取该前史指令中的第几个单词,单词是从0开端编号的,也便是说第0个单词代表指令自身,第1个到最终一个单词代表指令的参数;第三部分决议了对选取的单词如何润饰。下面我列出完好表格:

表格一、引证哪一条前史指令:

操作符 功用
! 一切对前史指令的引证都以 ! 开端,除了 oldstringnewstring^ 方式的快速替换
!n 引证第 n 条前史指令
!-n 引证倒数第 n 条前史指令
!! 引证上一条指令,等于 !-1
!string 逆向查找前史记录,第一条以 string 最初的指令
!?string[?] 逆向查找前史记录,第一条包括 string 的指令
oldstringnewstring^ 对上一条指令进行快速替换,将 oldstring 替换为 newstring
!# 引证当时输入的指令

表格二、选取哪一个单词:

操作符 功用
0 第0个单词,在 shell 中便是指令自身
n 第n个单词
第1个单词,运用 ^ 时能够省掉前面的冒号
$ 最终一个单词,运用 $ 是能够省掉前面的冒号
% 和 ?string? 匹配的单词,能够省掉前面的冒号
x-y 从第 x 个单词到第 y 个单词,-y 代表 0-y
* 除第 0 个单词外的一切单词,等于 1-$
x* 从第 x 个单词到最终一个单词,等于 x-$,能够省掉前面的冒号
x- 从第 x 个单词到倒数第二个单词

表格三、对选取的单词做什么润饰:

操作符 功用
h 选取途径最初,不要文件名
t 选取途径结束,只需文件名
r 选取文件名,不要扩展名
e 选取扩展名,不要文件名
s/oldstring/newstring/ 将 oldstring 替换为 newstring
g 大局替换,和 s 合作运用
p 只打印润饰后的指令,不履行

这几个指令其实挺好记的,h 代表 head,只需途径最初不要文件名,t 代表 tail,只需途径结束的文件名,r 代表 realname,只需文件名不要扩展名,e 代表 extension,只需扩展名不要文件名,s 代表 substitute,履行替换功用,g 代表 global,大局替换,p 代表 print,只打印不履行。有时分光运用 :p 还不行,咱们还能够把这个通过引证润饰后的指令直接在当时指令行上打开而不当即履行,它的快捷键是:

操作符 功用
Ctrl + Alt + E 在当时指令行上打开前史指令引证,打开后不当即履行,能够修正,按 Enter 后才会履行
Alt + ^ 和上面的功用一样

这两个快捷键,记住一个就行。这样,当咱们对前史指令的引证润饰完成后,能够先打开来看一看,假如正确再履行。眼见为实嘛,横竖我是每次都打开看看才放心。

录制屏幕并转换为 gif 动画图片##

最终,给咱们展示我做 gif 动画图片的过程。我用到的软件有 recordmydesktopmplayerconvert。运用 recordmydesktop 时需求一个单独的操控台来运转录像功用,录像完成后需求在该操控台中输入 Ctrl+C 停止录像。所以我用到了 tmux 。首先,我发动 tmux,然后运转 recordmydesktop --full-shots --fps 2 --no-sound --no-frame --delay 5 -o ~/图片/record_to_gif.ogv指令开端录像。由于 recordmydesktop 运转后不会马上退出,录像开端后,这个 window 就被占用了,所以我按 Ctrl+B c 让 tmux 再创立一个 window,然后在这个 window 中做的任何操作都会被录制下来。被录制的操作完成后,按 Ctrl+B n 切换到 recordmydesktop 指令运转的窗口,按 Ctrl+C 停止录像。然后,运用 mplayer -ao null record_to_gif.ogv -vo jpeg:outdir=./record_to_gif 将录制的视频提取为图片。当然,这时的图片比较多,为了缩减最终制造成的 gif 文件的巨细,咱们能够删掉其间无关紧要的帧,只留下关键帧。最终运用指令 convert -delay 100 record_to_gif/* record_to_gif.gif 生成 gif 动画。整个过程如下图:

像黑客一样使用 Linux 命令行

最终生成的 gif 图片一般都比较大,往往超越 20M,假如时间长一点,超越 60M 也是常事儿。而制造成 gif 之前每一帧图片也就 200k 左右而已。我想或许是由于 gif 没有像 jpeg 或 png 这么好的压缩算法吧。gif 抵挡向量图作用很不错,抵挡照片和我这样的截图,压缩就有点力不从心了。博客园允许上传的图片每张不能超越 10M,所以,为了减小 gif 文件的体积,我只有用 convert -resize 1024x576 record_to_gif.gif record_to_gif_small.gif 指令将图片变小后再上传了。

总结##

运用 Linux 指令行的技巧还有许多,我这儿不或许悉数讲到。学习 Linux 指令行的最好办法当然仍是运用 man bash 检查 Bash 的文档。可是我这儿讲的内容已经能够显著提高运用指令行的效率了,至少这两天下来,我觉得我自己有了质的腾跃。别的,在博客中运用 gif 动态图片做示例,我觉得也是我写博客以来一个质的腾跃。希望咱们喜欢。