我有一个有点特殊的 CLI 工作流程,但它对我来说很有效。我通常会迭代命令,然后在下一个命令中使用这些命令的结果。例如:
查找文件:
$ ff thing_im_looking_for_spec
./specs/foo/bar/thing_im_looking_for_spec.rb
重新运行该命令(因为它很快)并将其结果用作另一个程序的参数:
$ rspec `!!`
...扩展为:
$ rspec `ff thing_im_looking_for_spec`
...并运行我正在寻找的测试。从那里我可以按向上箭头并快速编辑以下内容:
$ vim `ff thing_im_looking_for_spec`
...编辑该文件。
我知道这很奇怪,但效果很好。我使用 [反引号][bang][bang][反引号] 来表示“是的,那个东西”感觉很舒服。
但是“`!!”有点难输入。是否可以为其创建别名?我一直不知道该怎么做,因为“`!!”本身就是最后一个命令的别名。
答案1
本身!!
可以通过使用 包装在别名或函数中history -p
,这允许脚本获取任何 !expansion 的结果(即使整个功能被禁用):
alias 1='eval "$(history -p !!)"'
现在是vim `1`
或rspec `1`
,输入起来相对更方便(不需要 Shift)。但是对于反引号就无能为力了。
嗯,从技术上讲,你可以不使用反引号来实现这一点,但这涉及一些奇怪的技巧:
shopt -s extdebug
trap 'case $BASH_COMMAND in *" that")
eval "${BASH_COMMAND/%" that"/" $(eval "$(history -p !!)")"}";
false;
esac' DEBUG
现在是vim that
或rspec that
。(此示例仅检测最后的字,以限制爆炸风险。修改以匹配/替换命令行中任何位置的单词留作练习。)
一个不那么奇怪的技巧是绑定一个按键(宏)自动插入,`!!`
就像输入一样:
bind '"\e[2~": "`!!`"'
这个例子告诉 bash 的阅读行翻译\e[2~
(实际上是Insert键)为`!!`
,这样您就可以输入来获得。任何输入(不一定是特殊的键序列)都可以转换为宏。vim Insert
vim `!!`
(其他可能的便捷键包括 Alt+Enter \e\n
、Ctrl+F \C-f
,等等。)