使用这些基本的Bash快捷方式节省命令行时间。大多数Bash历史指南都提供了所有可用快捷方式的详尽列表。这样做的问题是您会触及每个快捷方式的表面,然后在尝试了这么多之后就会不知所措。当我开始工作时,他们都被遗忘了,只记得!!我第一次开始使用Bash时学到的技巧。大多数这些技术永远不会进入记忆。本文概述了我每天实际使用的快捷方式。它基于我的书《Bash 学习,艰难之旅》中的内容(您可以阅读其中的示例章节以了解更多信息)。当人们看到我使用这些快捷方式时,他们经常问我,“你做了什么!?”学习它们需要很少的精力或智慧,但要真正学习它们,我建议每周学习一天。一个,然后继续下一个。值得花时间让它们触手可及,因为从长远来看,节省下来的时间非常重要。1、最后一个参数:!$如果你只想从这篇文章中学习一个快捷键,就是这个了。它会将最后一个命令的最后一个参数替换为您的命令行。看看这个情况:$mv/path/to/wrongfile/some/other/placemv:cannotstat'/path/to/wrongfile':Nosuchfileordirectory啊哈,我在命令“wrongfile”中写错了文件名,我应该用正确的文件名“rightfile”替换它。您可以重新键入之前的命令并将“wrongfile”完全替换为“rightfile”。但是,您也可以键入:$mv/path/to/rightfile!$mv/path/to/rightfile/some/other/place此命令也可以使用。在Bash中还有其他方法可以使用快捷方式实现相同的目的,但我最常使用的是重用上一个命令的最后一个参数的技巧。2.第n个参数:!:2你有没有做过这样的事情:$tar-cvfafolderafolder.tartar:failedtoopen像许多其他人一样,我经常以错误的顺序获取tar(和ln)。xkcdcomic当你弄乱参数时,你可以这样做:$!:0!:1!:3!:2tar-cvfafolder.tarafolder这样你就不会出丑了。上一条命令的每个参数的索引从零开始,可以用!:表示,后面跟着索引号。显然,您还可以使用它来重用先前命令中的特定参数而不是所有参数。3.所有参数:!:1-$假设我运行这样的命令:$grep'(ping|pong)'afile参数是正确的。但是,我想匹配文件中的“ping”或“pong”,但我使用的是grep而不是egrep。我开始输入egrep,但我不想重新输入其他参数。所以我可以使用!:1-$快捷方式调用前一个命令的所有参数,从第二个(记住它们是从零开始索引的,因此是1)到最后一个(用$表示)。$egrep!:1-$egrep'(ping|pong)'afileping您不必使用1-$来选择所有参数;您还可以选择一个子集,例如1-2或3-9(如果有这么多参数)。4.倒数第n行的最后一个参数:!-2:$当我犯了一个错误并且知道如何立即更正我的命令时,上面的快捷键非常有用,但我经常在原来的命令命令之后运行其他命令,这意味着之前的命令不再是我所指的命令。比如还是用之前的mv例子,如果我通过ls查看文件夹的内容来纠正我的错误:$mv/path/to/wrongfile/some/other/placemv:cannotstat'/path/to/wrongfile':没有这样的文件或目录$ls/path/to/rightfile我不能再使用!$快捷方式。在这些情况下,我可以在!之后插入-n:(其中n是要返回历史的命令数)从旧命令获取最后一个参数:$mv/path/to/rightfile!-2:$mv/path/to/rightfile/some/other/place同样,一旦你学会了它,你可能会惊讶于你需要经常使用它。5.进入文件夹:!$:h表面上看,这不是很好用,但我一天要用几十次。想象一下我运行的命令如下所示:$tar-cvfsystem.tar/etc/systemtar:/etc/system:Cannotstat:Nosuchfileordirectorytar:Errorexitdelayedfrompreviouserrors.我可能做的第一件事是进入/etc文件夹,查看其中的内容并找出我做错了什么。我可以这样做:$cd!$:hcd/etc上面写着:“获取前一个命令的最后一个参数(/etc/system)并删除它的最后一个文件名部分,只留下/etc。”6.Currentline:!#:1这些年来,在我终于弄清楚并学会之前,我有时想知道是否可以在当前行上引用一个参数。我多么希望我早点学会这条捷径。我经常用它来制作备份文件:$cp/path/to/some/file!#:1.bakcp/path/to/some/file/path/to/some/file.bak但是当我学会它时,它很快被以下快捷方式取代...7.搜索和替换:!!:gs这将搜索引用的命令并将前两个/之间的字符替换为后两个/之间的字符。假设我想告诉某人我的s键不起作用,而是输出f:$echomyfkeydoefnotworkmyfkeydoesnotwork然后我意识到这里出现的所有f键都是错误的。要用s替换所有的f,我可以键入:$!!:gs/f/s/echo我的s键不起作用我的s键不起作用它不仅适用于单个字符。我也可以替换单词或句子:$!!:gs/does/did/echo我的s键没有用我的s键没有用测试这个来告诉你如何组合这些快捷键,你知道这些命令片段会输出什么?$ping!#:0:gs/i/o$vi/tmp/!:0.txt$ls!$:h$cd!-2:$:h$touch!$!-3:$!!!$.txt$cat!:1-$总结对于日常使用命令行的用户来说,Bash可以作为快捷方式的优雅来源。虽然有成千上万的技巧需要学习,但这些是我最喜欢的一些我经常使用的技巧。
