2015-10-30 28 views
5

zsh和bash之类的shell有bang命令,它们以感叹号开头并展开到用户历史记录中的项目。如何在bash中交互式地展开bang命令?

为了得到最后运行的命令的最后一个参数,可以使用!$,例如,

$ echo one two three 
$ echo !$ !$ !$ 
> three three three 

在zsh的,能够扩大这些砰交互式命令:

touch foo bar 
ls !$<TAB> 

!$将扩大到foo内联。

这是非常有用的,因为它经常阻止我从错误:我按tab展开并确保我得到它正确和C-/撤消扩展时,我有信心。

在bash中是否有设置来实现bang命令的交互式扩展?

什么子shell和一般变量的扩张为此事(即echo $(uname)<TAB>echo Linuxecho $SHELL<TAB>echo /bin/bash)。

+0

你的问题的前提是读者明白zsh中的bang命令是什么。如果您描述了您之后的功能,则可能可以覆盖更广泛的受众群体。我猜M-。前缀参数接近你想要的,但我没有搜索到。 – tripleee

+2

http://structure.usc.edu/bash/bashref_8.html#SEC106解释了可用的绑定。 M-C-e会进行一般扩展,所以或多或少地出现在第二个问题中。 (请在将来每个帖子只有一个问题!) – tripleee

+0

我扩大了一下我的意思是与砰的命令。 我认为subhell,变量等机制是相同的,这就是为什么我包括问题的第二部分。 你说得对,谢谢,'shell-expand-line'确实是我在找的东西。 – kba

回答

8

有几个选项可以用于历史扩展。一个是:p修饰符,它将打印扩展的命令而不是执行它。

$ echo foo 
$ !!:p 
echo foo 

另一个是使用histverify选项,这使结果历史扩展的在壳缓冲器进行编辑而不是立即执行它的。

$ shopt -s histverify 
$ echo foo 
foo 
$ !! 
$ echo foo 

如果您对该命令感到满意,只需再次按下Enter键即可执行该命令,就像刚刚输入它一样。

默认情况下,加入了Readline命令history-expand-line势必M-^Alt-^Esc-^,取决于你的终端模拟器将作为元键),它扩展了当前命令行上的任何历史扩张。

还有一个普遍的ReadLine命令shell-expand-line(默认绑定到M-C-e),扩展在命令行上一切,就像外壳会按下回车键,但之前实际执行它之后。

+1

'shell-expand-line' readline命令是我正在寻找的。 'shopt -s histverify'也非常有用,谢谢。正如@tripleee在注释中指出的那样,获取最后一个命令(即'!$')的最后一个参数的快捷方式是'M-.'('Alt + .'或'Esc-.')。 – kba

+1

'Ctrl-x'也可以扩展该行(不执行)。 –