重复输入相似的命令的几种方法
在命令行经常需要重复输入一些shell代码,例如用cd切换到某个目录、运行npm run local,或者git commit等。每次都完整地一个个字符地敲入这些命令还是很麻烦的,这种时候就要寻找可以解决重复输入,提高效率的办法了。
最原始的,当然是找一个文本文件,把平时经常敲入的命令存放在其中,每当需要运行这些命令的时候就打开文件选中内容复制一下,再到终端粘贴并运行,但这未免过于原始了。
使用ctrl-r翻出历史命令
使用ctrl-r是一种不那么原始的方法。在终端中按下ctrl-r后,shell会等待进一步地输入,并根据输入从以前输入过的命令中找出匹配的一条。找到了自己所需要的命令行,直接敲击回车即可,效果如下
PS:上面是使用了fzf之后的效果,所以在敲入回车后并不会立即执行所选中的命令。原生的ctrl-r命令不支持在不同的位置上匹配输入字符,所以还是推荐一试fzf的。
使用alias
alias相比于ctrl-r而言进化了一点,因为它毕竟不再需要往命令行中塞入那么多字符了——它让终端用户可以用较短的内容来代替较长的内容。例如,我就给登录我本地的MySQL的命令写了一个alias
alias myroot='mysql -u root -p*******'
而且alias更像是宏展开,所以可以在后面添加其它内容,如下图
在myroot之后输入的test和user_info都跟着myroot展开后的结果一起喂给了shell去执行。使用alias之后,每次只需要输入较短的myroot即可。
使用函数
如果说alias是C语言里面的宏的话,那么shell所支持的函数就是C语言里面的函数了(这不是废话么)。alias始终不太适合所要输入的内容比较多的场景——定义也特别难写,并且alias没有输入参数可言,也不适合处理需要有为妙差异的重复内容的情况。shell函数很适合这种情况,例如,我在本地编辑完一个.sd文件后需要用sdedit将其转换为.png文件,方能上传到Confluence上贴到设计文档里,我希望.png文件跟.sd文件有相同的basename,那么用下面这个shell函数可以减轻一些重复输入的劳动力
# 根据.sd文件生成同名的.png文件 function sdpng() { basename=${1} /usr/local/bin/sdedit -t png -o ${basename}.png ${basename}.sd }
只需要我输入一次文件名即可,效果如下
使用Alfred的Snippets功能
Alfred带有一个叫做Snippets的特性
它跟上面所说的alias很相似,但它不是由shell自己处理悄悄展开的,它是显式地输入一长串的字符。比如说我定义了三个短语:gpd、gct,以及gpt,它们分别会展开为
git push -u origin develop git checkout test git push -u origin test
效果如下
Alfred的Snippets也跟alias一样是不能接受参数的,不过支持一些占位符,可以展开为一些特定模式的动态内容。一个比较有用的是{cursor}这个占位符,可以让光标定位至此。例如我可以定义这样的一串展开结果
SELECT * FROM `user_info` WHERE `userId` = {cursor}\G
这样我敲入对应的短语后就可以正确定位到WHERE语句,然后直接输入要查询的参数即可,效果如下
除了Alfred之外,还有其它的通过snippet提高输入效率的软件,比如aText,Dash,不过我没有实际地用过,就不多说了。
后记
没有代码才是最快地输入代码的方式
【阅读原文】