在 Bash 中完成时连续重新执行命令

71 linux bash

我试图找出一种简单的方法,无论出于何种原因(错误或其他原因),在命令完成时继续重新执行命令。

解决这个问题的最佳方法是什么?

编辑:我之前不够清楚。我需要下一次执行才能等到上一次执行完成。

编辑 2:几乎所有的答案都很好用。我错误地认为大多数答案要么分叉进程,要么只重新执行一次,这两种情况都不需要。

Pau*_*aul 114

watch命令将以指定的间隔永远重复一个命令:

watch -n0 <command>
Run Code Online (Sandbox Code Playgroud)

设置-n为零有效地使间隔为零(我认为它实际上是 0.1 秒)。

watch 还具有对齐输出的额外好处,因此可以轻松看到视觉变化,并具有突出显示上次运行的变化的开关。

参考:手表手册页

watch 重复运行命令,显示其输出(第一个全屏)。这使您可以观察程序输出随时间的变化。默认情况下,程序每 2 秒运行一次;使用 -n 或 --interval 指定不同的间隔。

watch 将一直运行直到被中断。

  • 到目前为止,所有的答案都是这样做的,包括这个。除非您特别要求,否则 Linux 不会分叉。 (6认同)

Den*_*nis 44

这会创建一个无限循环,command一遍又一遍地执行。

while :
do
    command
done
Run Code Online (Sandbox Code Playgroud)

  • @calcifer 这个答案很有效。你的程序有一些不寻常的地方,到目前为止回答的四个用户都没有预料到,你没有提到它。 (8认同)

Blu*_*Sky 19

一个简单的解决方案是:

yourcommand; !#
Run Code Online (Sandbox Code Playgroud)

;分隔命令,允许在一行中包含多个命令(Bash: Lists

!#告诉 bash “重复我到目前为止在这一行中写的所有内容”(Bash: Event-Designators


Dan*_*eck 7

您可以在命令执行期间提前计划(假设它不是交互式的)并输入!!哪个将再次执行上一个命令。这例如在ping -c 5.


您还可以在 中定义一个函数bash

function repeat { "$@"; "$@"; }
Run Code Online (Sandbox Code Playgroud)

要保留它,请将其存储在~/.bashrc.

然后,您可以像这样运行您的命令:

repeat ping -c5 heise.de
Run Code Online (Sandbox Code Playgroud)

如果它是您想要重复执行的特定命令(而不是例如任何命令),您可以"$@"在该片段中替换为您的实际命令,并将该函数命名为例如repeat_ping


要使其无限循环,您可以按照@Dennis 的建议进行操作。如果您打算在交互式 shell 中使用它,我建议您添加一个等待期,如下所示:

function repeat { while 1 ; do "$@" ; sleep 1 ; done; }
Run Code Online (Sandbox Code Playgroud)

否则使用Ctrl-Z.

  • @calcifer 这些执行等到程序调用返回。您的程序是否与外壳分离并在退出之前返回? (6认同)

小智 5

为循环提供while一个布尔条件,如下所示:

#!/bin/bash

while true; do

    do_something && wait

done
Run Code Online (Sandbox Code Playgroud)

这将一遍又一遍地执行,直到 bash 收到终止进程的信号。通常采用 的形式ctrl+c

您还可以使用该watch命令重复运行脚本。例如,在 bash 终端中使用的简单时钟watch可能如下所示:

$ watch -t -n1 date +%T
Run Code Online (Sandbox Code Playgroud)

-t选项指示watch不显示正在运行的进程的标题。这将为您提供仅重复的命令的干净输出。该-n1选项告诉手表每秒重复一次n。在这种情况下,-n1将是1秒的间隔。然后date +%T命令显示命令完成时的时间。执行此命令将为您的终端提供一个活动时钟。

然后,任何其他答案中都没有的另一种方法是无限函数调用。

do_something() { do_something }; do_something && wait
Run Code Online (Sandbox Code Playgroud)

这本质上与仅使用递归函数调用的布尔循环相同while

(编辑)为了记住计算机的资源,我添加了 ,&& wait以便每次运行进程时,循环都会“等待”,直到该进程在下一次迭代之前以退出状态 0 完成。这在交互式 shell 脚本中很有用。