重复最后 N 个命令

重复最后 N 个命令

在 bash 中,我尝试编写一个脚本来运行最后 N 个命令。比如说,N=5

for i in {1...5}
do
    !-5
done

问题是 !-5 被我的 shell 上的最后 5 个命令(比如 time)替换,并且“time”命令运行了 5 次。

我可以对脚本进行任何更改,使其在 shell 上连续运行最后 5 个命令吗?


注意:我在查看其他类似问题后发布了这个问题,但该问题没有回答我的要求。情况类似于:
Qn1 - "How do you print 3 Continuous tildes '~~~' in C++"
Ans: cout<<"~~~";

Qn2 - “如何在 C++ 中打印 N 个连续的波形符 '~~~'”
Ans: 运行一个循环并执行 cout <<"~";在循环内

标记为重复的问题与上面的 Qn1 类似,我想要的是上面的 Qn2 的答案。因此,我争论这个问题与上一个问题重复的事实。

答案1

使用fc -N -1,将打开一个包含最后 N 个命令的编辑器。
您可以编辑命令。
当您保存它们时它们就会运行。

如果您不想编辑命令,请使用选项fc指定-ecat编辑器:

fc -e : -3 -1

如果您想将其与 N 参数一起使用,则别名没有帮助。您甚至不能拥有像“fc -1”这样的别名并附加-N,因为-1需要位于-N.

所以我们需要使用一个函数:

runlast () {
    fc -e : "-${1:-1}" -1 
}

如果没有给出参数,则显式设置N为;1在这种情况下,将重复最后一个命令。


下面是它的工作原理,使用echo 1toecho 4作为最后一个命令:

$ echo 1
1
$ echo 2
2
$ echo 3
3
$ echo 4
4
$ runlast 2
echo 3
echo 4
3
4
$

(最后一行$是新的提示。)

答案2

不确定您到底想做什么,但您可以尝试以下操作:

eval "$(fc -ln -5)"

或者

fc -e : -5 -1

重新运行最后 5 个命令。

答案3

我认为你可以这样做:

$ echo yo
yo
$ echo hey there
hey there
$ for i in {2..1}; do eval "$(history -p \!-$i)"; done
yo
hey there

help history

-p   perform history expansion on each ARG and display the 
     result without storing it in the history list

相关内容