如何在bash中以交互方式扩展bang命令?

时间:2015-10-30 10:08:49

标签: bash shell zsh

像zsh和bash这样的shell有 bang命令,它以感叹号开头并扩展到用户历史记录中的项目。

要获取最后一个运行命令的最后一个参数,可以使用!$,例如

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

在zsh中,可以交互式地扩展这些bang命令:

touch foo bar
ls !$<TAB>

!$将扩展为foo内联。

这非常有用,因为它经常让我免于出错:我按tab展开并确保我做对了C-/以便在我有信心时撤消扩展。

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

如何扩展子shell和一般变量(例如echo $(uname)<TAB>echo Linuxecho $SHELL<TAB>echo /bin/bash)。

1 个答案:

答案 0 :(得分:8)

您可以使用一些选项进行历史记录扩展。一个是:p修饰符,它打印扩展命令而不是执行它。

$ echo foo
$ !!:p
echo foo

另一种方法是使用histverify选项,它将历史记录扩展的结果放在shell缓冲区中进行编辑,而不是立即执行它。

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

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

默认情况下,Readline命令history-expand-line绑定到M-^Alt-^Esc-^,具体取决于您的终端仿真程序作为元键发送的内容),这会扩展当前命令行上的任何历史记录扩展。

还有一个普通的Readline命令shell-expand-line(默认情况下绑定到M-C-e),它会在命令行上扩展所有,就像命中行后的shell一样但就在实际执行之前。