作为一名Linux用户,你一定在Linux终端输入过无数命令。有些命令很短,比如:ls、cd、pwd等,这样的命令你不会觉得有压力。但是,有些命令比较长,比如:$gitpushoriginHEAD:refs/for/master这个时候,你连一个字母都打错了,会不会死机?我以前的做法是,如果你输入了错误的命令,就把光标移到错误的地方,然后修改它。我相信不仅是我,大多数朋友都是这样做的。命令比较短,但是如果命令很长,是不是疯了?今天良旭将介绍7个改进Bash下命令输入的方法。如果您输入了错误的命令,您可以有效地纠正它。1、获取命令的最后一个参数:!$在Bash中,!$表示命令的最后一个参数。让我们用下面的场景来说明这个符号的作用。如果我想把一个文件移动到另一个地方,但是文件名是错误的,例如:$mv/path/to/wrongfile/some/other/placemv:cannotstat'/path/to/wrongfile':Nosuchfileordirectory中这种情况下,我们将光标移动到错误的文件名,然后修改文件名使其正确。这种方法当然可以,但是如果命令比较长,效率会比较低。这种情况下,我们可以这样操作:$mv/path/to/rightfile!$mv/path/to/rightfile/some/other/place这样我们就不用再输入最后一个参数了,如果这个参数足够长,效率提升会很明显。2、获取命令的第n个参数:!:n我们经常会把命令的参数顺序弄错,例如:$tar-cvfafolderafolder.tartar:failedtoopen这个时候我们一般把参数顺序错了删除,然后输入正确的参数。这时候如果参数很长,估计你有爆屏的冲动。这时候你可以这样操作:$!:0!:1!:3!:2tar-cvfafolder.tarafolder完美解决问题!但是,这些符号是什么意思?如果仔细看,应该能看出猫腻。根据错误的命令,!:0其实是tar,!:1是-cvf,!:2是afold,!:3不用我说了吧?说白了,就是一个位置参数。那么我们只需要根据position参数重新排列这些元素的顺序,就OK了,简单吗?PS:!:表示最后一个位置元素。3、获取所有参数:!:1-$一般来说,命令的第一个元素是具体的命令,后面是参数。如果我们想要获取所有参数,我们可以使用!:1-$。比如我想用tar命令,但是写成了zip:$zip-cvfafolder.tarafolder这时候,你可以这样做:$tar!:1-$当然,如果你不想得到所有的参数,你也可以使用它!:1-2,或者!:3-9得到参数的子集,当然前提是你有足够的参数。4、获取最后n条命令的参数:!-n:$在Linux下,我们会敲很多条命令。一般来说,!代表最后一条命令,相当于!-1。如果我们想获取最后第n个命令的参数,我们可以使用!-n:$。比如我们移动文件的时候提示文件不存在,我们通常会使用ls命令查看对应目录下有哪些文件:$mv/path/to/wrongfile/some/other/placemv:cannotstat'/path/to/wrongfile':Nosuchfileordirectory$ls/path/to/rightfile这个时候我们会用!$来获取/path/to/元素,也就是当前上一条命令的最后一个元素,但是我们需要的是倒数第二个命令的元素呢?我们可以使用!-2:$:$mv/path/to/rightfile!-2:$mv/path/to/rightfile/some/other/place这样我们在命令来回切的时候,需要上一个元素,可以使用这个快捷键。5.获取文件对应的目录:!$:h如果我们要打包一个文件,然后提示文件不存在:$tar-cvfsystem.tar/etc/afiletar:/etc/afile:Cannotstat:没有这样的文件或目录tar:错误退出从以前的错误中延迟。这时候,我们通常的做法是进入/etc目录,看看里面都有哪些文件。这很好,但是如果路径名很长,那么您可能需要再次戳屏幕。我们可以使用!$:h来获取最后一个参数对应的路径。现在最后一个参数是/etc/afile,afile对应的路径是/etc/。我们可以用!$:h来获取最后一个参数对应的路径:$cd!$:hcd/etc6。获取当前行的第一个元素:!#:1通常情况下,我们重命名一个文件,通常是这样写的:$mv/path/to/some/file/path/to/some/file.bak这两个参数很类似,但是后面加了.bak,需要写两遍,太费时了!我们可以用!#:1获取当前行的第一个参数,直接修改!$cp/path/to/some/file!#:1.bakcp/path/to/some/file/path/to做/some/file.bak保存了很多字母?7、替换命令中的字符串:!!:gs这个操作就更厉害了,它可以直接替换前面命令中的一些字符串。比如我们有这样一个命令:$echomyfkeydoefnotworkmyfkeydoefnotwork如果我们想把f换成s,我们可以这样做:$!!:gs/f/s/echomyskeydoesnotworkmyskeydoesnotwork同样,如果我们想把does改成did,我们可以这样做this:$!!:gs/does/did/echomyskeydidnotworkmyskeydidnotwork通过这个方法,你可以把命令中的关键字改成你想要的。小结本文介绍了7个可以提高命令输入效率的快捷键。如果你熟练地使用它们,你会达到事半功倍的效果。这些方法仍然比较分散。如果将它们放在一起,肯定会发挥出更强的作用。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!
