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

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

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

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

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

touch foo bar
ls !$<TAB>

!$将扩展为foo inline.

这非常有用,因为它经常让我不会犯错误:我按Tab键展开并确保我正确并且C- /在我有信心时撤消扩展.

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

如何扩展子shell和一般变量(即echo $(uname)< TAB>以回显Linux并回显$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),它扩展了命令行上的所有内容,就像shell在按Enter键之后但在实际执行之前一样.

转载注明原文:如何在bash中以交互方式扩展bang命令? - 代码日志