我试图找出一种简单的方法,使它无论出于任何原因(错误或其他原因),在执行完命令后都能重新执行。
解决此问题的最佳方法是什么?
编辑:我之前还不够清楚。我需要的下一个执行的等待,直到前一个结束。
编辑2:几乎所有答案都很好。我错误地认为,大多数答案将要么分叉该过程,要么仅重新执行一次,而这都不是必需的。
我试图找出一种简单的方法,使它无论出于任何原因(错误或其他原因),在执行完命令后都能重新执行。
解决此问题的最佳方法是什么?
编辑:我之前还不够清楚。我需要的下一个执行的等待,直到前一个结束。
编辑2:几乎所有答案都很好。我错误地认为,大多数答案将要么分叉该过程,要么仅重新执行一次,而这都不是必需的。
Answers:
这将创建一个无限循环,command
反复执行。
while :
do
command
done
while true; do echo 'Hit CTRL+C'; sleep 1; done
感谢cyberciti.biz/faq/bash-infinite-loop
该watch
命令将以指定的时间间隔永久重复一条命令:
watch -n0 <command>
设置-n
为零将有效地使间隔为零(我认为确实是.1秒)。
watch
它还具有对齐输出的额外好处,因此可以轻松看到视觉变化,并具有一个突出显示上次运行变化的开关。
watch反复运行命令,显示其输出(第一个全屏显示)。这使您可以观察程序输出随时间的变化。默认情况下,该程序每2秒运行一次;使用-n或--interval指定不同的间隔。
手表将一直运行直到被打断。
watch ls
在包含文件的目录中进行任何操作?
一个简单的解决方案是:
yourcommand; !#
;
分隔命令,允许一行中包含多个命令(Bash:Lists)
!#
告诉bash“重复到目前为止我在这一行中写的所有内容”(Bash:Event-Designators)
yourcommand; !!
实际上它不能与同一行上的命令一起使用!#
。干杯!
; !#
不适用于ZSH,它只是扩展了本质上是克隆它的语句,它没有触发它
您可以在命令执行期间预先计划(如果它不是交互式的),然后输入!!
将再次执行上一条命令的命令。这在例如期间有效ping -c 5
。
您还可以在中定义一个函数bash
:
function repeat { "$@"; "$@"; }
要保留它,请将其存储在中~/.bashrc
。
然后,您可以像这样运行命令:
repeat ping -c5 heise.de
如果这是您要重复执行的特定命令(而不是任何命令),则可以"$@"
用您的实际命令替换该代码段,然后将函数命名为eg repeat_ping
。
要使其成为无限循环,您可以执行@Dennis建议的操作。如果您打算在交互式外壳程序中使用它,我建议您添加一个等待时间,例如:
function repeat { while 1 ; do "$@" ; sleep 1 ; done; }
否则,使用终止此无限循环会很不方便Ctrl-Z
。
给一个while
循环一个布尔条件,例如:
#!/bin/bash
while true; do
do_something && wait
done
这将一遍又一遍执行,直到bash收到终止进程的信号。通常以的形式出现ctrl+c
。
您也可以使用该watch
命令重复运行脚本。例如,在bash终端中使用的简单时钟watch
可能类似于:
$ watch -t -n1 date +%T
该-t
选项指示watch
不显示其正在运行的进程的标题。这使您仅输出正在重复的命令的清晰输出。该-n1
选项告诉手表每秒钟重复一次n
。在这种情况下,-n1
将间隔1
秒。然后,date +%T
命令显示命令完成时的时间。执行此命令将为您的终端提供一个活动时钟。
然后,其他任何答案中都没有的另一个方法将是无限函数调用。
do_something() { do_something }; do_something && wait
这与while
仅使用递归函数调用的布尔循环基本相同。
(编辑)为了记住您机器的资源,我添加了,&& wait
这样每次运行一个进程时,循环将“等待”直到该进程在下一次迭代之前以退出状态0结束。这在交互式shell脚本中很有用。
while
循环示例,但未使用布尔true
语法。有一个watch
示例,但没有提供许多有用的语法。我将针对可能对谁有帮助的人进行详细说明。我想给这些提供一些实际的实用性。该while
循环布尔也可以false
不执行,直到一个不真实的条件得到满足。非常方便。
if
保持重新执行?
我今天有点
从无限流之一读取并通过管道传输到 xargs
cat /dev/zero | xargs --null echo hello there
如果您需要在其中稍作休息,则可能需要执行 sh
cat /dev/zero | xargs --null sh -c "echo hello there && sleep 3"