在 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
指定-e
为cat
编辑器:
fc -e : -3 -1
如果您想将其与 N 参数一起使用,则别名没有帮助。您甚至不能拥有像“fc -1”这样的别名并附加-N
,因为-1
需要位于-N
.
所以我们需要使用一个函数:
runlast () {
fc -e : "-${1:-1}" -1
}
如果没有给出参数,则显式设置N
为;1
在这种情况下,将重复最后一个命令。
下面是它的工作原理,使用echo 1
toecho 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