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

How to interactively expand a bang command in bash?

zsh 和 bash 等 Shell 具有 bang 命令,它们以感叹号开头并扩展到用户历史记录中的项目。

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

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

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

touch foo bar
ls !$<TAB>

!$ 将扩展为 foo 内联。

这非常有用,因为它经常防止我犯错误:我按 tab 展开并确保我做对了,然后 C-/ 在我有信心时撤消展开。

bash中有设置可以实现bang命令的交互扩展吗?

关于子外壳的扩展和一般变量(即 echo $(uname)<TAB>echo Linuxecho $SHELL<TAB>echo /bin/bash)。

有几个选项可用于历史扩展。一种是 :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),它在命令行上展开everything,就像shell 会在按下 Enter 键后实际执行之前执行。