重复上一个命令 N 次

重复上一个命令 N 次

除了编写循环之外,有没有办法重复最后一个命令 N 次。

例如,我可以使用双声 (!!) 重复最后一个命令一次,但如何重复 30 次呢?

答案1

使用zsh, 和 ,前提是最后一个命令行只有一个命令或管道或 and-or 列表(例如echo x, echo x | tr x y, ,甚至像or /循环echo x && echo y这样的复合命令,但不是):{ x; y; }forwhileecho x; echo y

repeat 30 !!

要重复上一个命令行(即使它包含多个命令),请使用:

repeat 30 do !!; done

或者:

repeat 30 {!!}

仅对于bash简单命令(在上面的示例中,仅是情况echo x),您可以定义一个辅助函数,例如:

repeat() {
  local n="$1"
  shift
  while ((n-- > 0)); do
    "$@"
  done
}

(并repeat 30 !!像上面一样使用)。副作用是,因为代码将在函数中运行,所以它会看到不同的"$@""$#"并且类似的事情typeset会以不同的方式工作,因此您不能执行以下操作:

eval 'echo "$1"'
repeat 30 !!

另一种模拟的方法zshrepeat 30 {!!}声明一个别名,例如:

alias repeat='for i in $(seq'

(假设未修改$IFS

然后使用:

repeat 30); { !!; }

答案2

我能想出的最短的是:

date # or whatever command
for i in {1..30}; do !!; done

答案3

一种方法是使用行编辑器插入!!;30 次。

readline就像模式中的(bash的行编辑器)一样vi

!!; Escdd30p

等效模式emacs确实适用于zsh行编辑器,但显然不适用于bashs readline。但是,您可以使用readlinekbd 宏来代替,它显然可以重复:

将 kbd 宏定义为!!;

Ctrl+X(!!; Ctrl+X)

您可以稍后调用 30 次,如下所示:

Alt+3Alt+0Ctrl+Xe

答案4

seq命令是标准 *nix 的一部分,因此不依赖于您的 shell。使用它和 shell 的循环结构,您可以执行以下操作:

for i in $(seq 30); do !!; done

或者

for i in `seq 30`; do !!; done

相关内容