像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 Linux
和echo $SHELL<TAB>
到echo /bin/bash
)。
答案 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一样但就在实际执行之前。