我试图找出一种简单的方法,无论出于何种原因(错误或其他原因),在命令完成时继续重新执行命令。
解决这个问题的最佳方法是什么?
编辑:我之前不够清楚。我需要下一次执行才能等到上一次执行完成。
编辑 2:几乎所有的答案都很好用。我错误地认为大多数答案要么分叉进程,要么只重新执行一次,这两种情况都不需要。
Pau*_*aul 114
该watch命令将以指定的间隔永远重复一个命令:
watch -n0 <command>
Run Code Online (Sandbox Code Playgroud)
设置-n为零有效地使间隔为零(我认为它实际上是 0.1 秒)。
watch 还具有对齐输出的额外好处,因此可以轻松看到视觉变化,并具有突出显示上次运行的变化的开关。
watch 重复运行命令,显示其输出(第一个全屏)。这使您可以观察程序输出随时间的变化。默认情况下,程序每 2 秒运行一次;使用 -n 或 --interval 指定不同的间隔。
watch 将一直运行直到被中断。
Den*_*nis 44
这会创建一个无限循环,command一遍又一遍地执行。
while :
do
command
done
Run Code Online (Sandbox Code Playgroud)
Blu*_*Sky 19
一个简单的解决方案是:
yourcommand; !#
Run Code Online (Sandbox Code Playgroud)
;分隔命令,允许在一行中包含多个命令(Bash: Lists)
!#告诉 bash “重复我到目前为止在这一行中写的所有内容”(Bash: Event-Designators)
您可以在命令执行期间提前计划(假设它不是交互式的)并输入!!哪个将再次执行上一个命令。这例如在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.
小智 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 脚本中很有用。
| 归档时间: |
|
| 查看次数: |
103816 次 |
| 最近记录: |