你们好,我是良许。linux
做为 Linux 用户,你们确定在 Linux 终端下敲过无数的命令。有的命令很短,好比:ls
、cd
、pwd
之类,这种命令你们毫无压力。可是,有些命令就比较长了,好比:git
$ git push origin HEAD:refs/for/master
这个时候,你要是敲错了哪怕是一个字母,是否是很崩溃?面试
之前个人做法是,若是敲错了命令,就把光标移动到错误的地方,再进行修改。相信不只是我,大部分的小伙伴都是这么干的吧。.net
命令比较短还好,万一命令很长,是否是很抓狂?code
今天,良许就给你们介绍 Bash 下 7 种能够提升命令输入的方法,万一输错了命令,能够高效纠正过来。ip
!$
字符串
在 Bash 中,!$
表明命令中的最后一个参数。咱们来如下面的场景来讲明这个符号的做用。假如我想把某个文件移动到另外一个地方,但文件名写错了,好比:get
$ mv /path/to/错误的文件 /some/other/place mv: cannot stat '/path/to/错误的文件': No such file or directory
在这个状况下,咱们会把光标移动到错误的文件名那边,而后将文件名修改正确。这种方法固然能够,但如何命令比较长,效率就会比较低。博客
在这个状况下,咱们能够这样操做:it
$ mv /path/to/对的文件 !$ mv /path/to/对的文件 /some/other/place
这样咱们就没必要再输入最后一个参数,若是这个参数很长,那效率的提升将是显而易见的。
!:n
咱们常常会出现将命令的参数次序放错的状况,好比:
$ tar -cvf afolder afolder.tar tar: failed to open
这时候一般状况下咱们会把放错次序的参数删掉,而后再输入正确的参数。这时候若是参数很长的话,我估计你都有打爆屏幕的冲动。
这时候你能够这么操做:
$ !:0 !:1 !:3 !:2 tar -cvf afolder.tar afolder
完美解决问题!可是,那几个符号又是啥意思呢?
你仔细看的话,应该是能看出猫腻的。基于输错的那个命令,!:0
其实就是 tar
,!:1
就是 -cvf
,!:2
就是 afold
,!:3
不用我说了吧?说白了,就是位置参数。
因此咱们只要按位置参数把这几个元素从新排好次序,就OK了,简单吧?
PS: !:
表示的是最后一个位置元素。
!:1-$
通常来说,一条命令的第一个元素就是具体的命令,后面跟的就是参数。若是咱们要获取全部的参数,那就可使用 !:1-$
。
好比说,我本想使用 tar 命令,但写成了 zip :
$ zip -cvf afolder.tar afolder
这时候,你能够这么操做:
$ tar !:1-$
固然,若是你不想获取全部参数的话,也可使用 !:1-2
,或者 !:3-9
来获取参数子集,固然前提是你要有足够多的参数。
!-n:$
在 Linux 下咱们会敲大量的命令,通常来说 !
表明的是最后一条命令,它与 !-1
是至关的。假如咱们想获取倒数第 n 条命令的参数,可使用 !-n:$
。
好比,咱们移动文件的时候若是提示文件不存在,咱们通常会用 ls 命令去看一眼对应的目录下有啥文件:
$ mv /path/to/wrongfile /some/other/place mv: cannot stat '/path/to/wrongfile': No such file or directory $ ls /path/to/ rightfile
这时候,咱们再使用 !$
将获取到 /path/to/
这个元素,也就是当前最后一条命令的最后一个元素,可是咱们须要的是倒数第二条命令的元素,要怎么办呢?
咱们可使用 !-2:$
:
$ mv /path/to/rightfile !-2:$ mv /path/to/rightfile /some/other/place
因此咱们在命令切来切去的时候,又须要以前的元素,就可使用这个快捷键了。
2020 精选 阿里/腾讯等一线大厂 面试、简历、进阶、电子书 公众号「 良许Linux」后台回复「 资料」免费获取
!$:h
假如咱们想打包一个文件,而后提示那个文件不存在:
$ tar -cvf system.tar /etc/afile tar: /etc/afile: Cannot stat: No such file or directory tar: Error exit delayed from previous errors.
这个时候,咱们一般的做法是,进到 /etc 目录,而后看下那里面有啥文件。这样固然能够,但若是路径名很长的话,那你可能又想戳破屏幕了。
咱们可使用 !$:h
来获取最后一个参数对应的路径。如今最后一个参数是 /etc/afile
,afile 所对应的路径就是 /etc/ 。咱们可使用 !$:h
来获取最后一个参数对应的路径:
$ cd !$:h cd /etc
!#:1
一般状况下,咱们重命名一个文件,通常是这么写的:
$ mv /path/to/some/file /path/to/some/file.bak
这两个参数极其类似,只是后面一个加了个 .bak ,而咱们就须要写两遍,太浪费时间了!咱们可使用 !#:1
来获取当前行的第一个参数,直接修改!
$ cp /path/to/some/file !#:1.bak cp /path/to/some/file /path/to/some/file.bak
这样是否是能够少敲至关多的字母?
!!:gs
这个操做就更厉害了,它能够直接替换以前命令的某些字符串。好比,咱们有这样的一条命令:
$ echo my f key doef not work my f key doef not work
若是咱们想把 f
替换成 s
,能够这样操做:
$ !!:gs/f /s / echo my s key does not work my s key does not work
一样地,若是咱们想把 does
改为 did
,能够这样:
$ !!:gs/does/did/ echo my s key did not work my s key did not work
经过这种方法,就能够把命令中的关键词改为本身想要的内容。
本文介绍了 7 个能够提升命令输入效率的快捷键,熟练使用它们的话会达到事半功倍的效果。这几个方式还比较零散,若是你把他们放在一块儿的,确定还会发挥出更强大的效果。