TL; DR: alias @@='$($(fc -ln -1) |& tail -1)'
Bash的历史记录交互功能不提供任何机制来检查命令的输出。外壳程序不存储该内容,历史记录扩展专门用于您自己运行的命令或部分命令。
这样就剩下了重新运行最后一个命令并将stdout和stderr(|&
)用管道传递到命令替换中的方法。heemayl的答案可以达到此目的,但是不能在别名中使用,因为外壳程序会在扩展别名之前而不是之后执行历史扩展。
我什至无法通过扩展功能在shell函数中使用历史记录扩展,即使通过在功能中启用它也是如此set -H
。我怀疑!!
会不会被扩展的功能,我不知道它会扩大到如果它是,但现在我不知道正因如此,事实并非如此。
因此,如果您想进行设置以便只需很少的输入就可以执行此操作,则应使用fc
内置的Shell而不是历史扩展来从历史中提取最后一条命令。这具有额外的优点,即使禁用历史记录扩展,它也可以工作。
如图戈登戴维森的答案来创建包含bash的历史扩展的别名(上超级用户),$(fc -ln -1)
会模拟!!
。堵漏这对于!!
在heemayl的命令 $(!! |& tail -1)
得到:
$($(fc -ln -1) |& tail -1)
这类似于,$(!! |& tail -1)
但可以使用别名定义:
alias @@='$($(fc -ln -1) |& tail -1)'
在运行该定义或将其放入.bash_aliases
或.bashrc
启动新的外壳程序之后,您可以简单地键入@@
(或使用任何别名)来尝试执行上一条命令的最后一行输出。
ek@Io:~$ alias @@='$($(fc -ln -1) |& tail -1)'
ek@Io:~$ evolution
The program 'evolution' is currently not installed. You can install it by typing:
sudo apt-get install evolution
ek@Io:~$ @@
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
evolution-common evolution-data-server evolution-data-server-online-accounts
....