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

kba*_*kba 6 bash shell zsh

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

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

$ echo one two three
$ echo !$ !$ !$
> three three three
Run Code Online (Sandbox Code Playgroud)

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

touch foo bar
ls !$<TAB>
Run Code Online (Sandbox Code Playgroud)

!$将扩展为foo内联.

这非常有用,因为它经常使我免于犯错:我按下tab扩展并确保我做对了,并C-/在我有信心时撤消扩展.

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

如何扩展子壳和一般变量(即echo $(uname)<TAB>echo Linuxecho $SHELL<TAB>echo /bin/bash).

che*_*ner 9

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

$ echo foo
$ !!:p
echo foo
Run Code Online (Sandbox Code Playgroud)

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

$ shopt -s histverify
$ echo foo
foo
$ !!
$ echo foo
Run Code Online (Sandbox Code Playgroud)

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

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

还有一个普通的Readline命令shell-expand-line(M-C-e默认绑定),它扩展命令行上的所有内容,就像shell在按Enter键之后但在实际执行之前一样.