像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 Linux和echo $SHELL<TAB>到echo /bin/bash).
您可以使用一些选项进行历史记录扩展.一个是: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键之后但在实际执行之前一样.