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


62

我试图找出一种简单的方法,使它无论出于任何原因(错误或其他原因),在执行完命令后都能重新执行。

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

编辑:我之前还不够清楚。我需要的下一个执行的等待,直到前一个结束。

编辑2:几乎所有答案都很好。我错误地认为,大多数答案将要么分叉该过程,要么仅重新执行一次,而这都不是必需的。

linux  bash 

1
你还是不清楚。如果您提到正在执行的程序,这将有所帮助。
丹尼尔·贝克

1
-1这个问题没有显示任何研究成果,因为用户评论说答案没有用,而是实际尝试按照他们的建议去做。
丹尼尔·贝克

Answers:


39

这将创建一个无限循环,command反复执行。

while :
    do
        command
done

请查看对原始问题的修改。我需要一遍又一遍地重新执行它,而不仅仅是一次。

8
@calcifer这个答案效果很好。您的程序有一个与众不同的地方,到目前为止,四个用户都没有想到可以回答,而您却没有提及它。
丹尼尔·贝克

@calcifer这是一个无限循环。它一直重复到时间结束(嗯,直到脚本终止为止)
Nate Koppenhaver

1
不好的是,我以为这个(以及所有其他答案)要么会分叉该过程,要么只会重新执行一次,而这两个都不是所需要的。所以是的,这个答案有效。谢谢。

1
一线版本:while true; do echo 'Hit CTRL+C'; sleep 1; done感谢cyberciti.biz/faq/bash-infinite-loop
jk2K

107

watch命令将以指定的时间间隔永久重复一条命令:

watch -n0 <command>

设置-n为零将有效地使间隔为零(我认为确实是.1秒)。

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

参考:手表手册页

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

手表将一直运行直到被打断。


请查看对原始问题的修改。

6
到目前为止,所有答案(包括此答案)都可以做到这一点。除非您明确要求,否则Linux不会分叉。
保罗

我不了解叉子,谢谢。

使用此方法看不到任何输出。
拉菲·哈查杜安

@RaffiKhatchadourian您是说如果watch ls在包含文件的目录中进行任何操作?
保罗

17

一个简单的解决方案是:

yourcommand; !#

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

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


1
抱歉,我还不够清楚。我需要一遍又一遍地重新执行它,而不仅仅是一次。

为此,我一直在寻找它,尤其是因为yourcommand; !!实际上它不能与同一行上的命令一起使用!#。干杯!
sdaau,2015年

; !#不适用于ZSH,它只是扩展了本质上是克隆它的语句,它没有触发它
回顾

7

您可以在命令执行期间预先计划(如果它不是交互式的),然后输入!!将再次执行上一条命令的命令。这在例如期间有效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


请查看对原始问题的修改。

6
@calcifer这些执行将等到程序调用返回。您的程序是否从外壳分离并在退出之前返回?
丹尼尔·贝克

不好的是,我以为这个(以及所有其他答案)要么会分叉该过程,要么只会重新执行一次,而这两个都不是所需要的。所以是的,这个答案有效。谢谢。

4

给一个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脚本中很有用。


1
有一个while循环示例,但未使用布尔true语法。有一个watch示例,但没有提供许多有用的语法。我将针对可能对谁有帮助的人进行详细说明。我想给这些提供一些实际的实用性。该while循环布尔也可以false不执行,直到一个不真实的条件得到满足。非常方便。

1
@ Spittin'IT为方便起见,添加了其他答案未使用的方法。

足够公平,我了解...我只是在评论模块中发表评论,但是很好地进行编辑和跟进!!
皮条客果汁IT

如何if保持重新执行?
卡米尔Maciorowski

卡米尔好点。忘了使其递归大声笑。使用在if语句中调用自身的函数进行编辑时已修复。

0

这是我在bash中重复命令的另一种方法。对于某些人来说,这听起来很愚蠢,因为它不涉及编写脚本,并且可能为许多人所熟知。但我认为值得一提的是它快速且对初学者友好,在某种意义上来说,无需记住太多语法。我只在Ubuntu的gnome-terminal中测试过,其他终端可能不支持。

  1. 在终端中输入一次命令。
  2. 用鼠标选择包含换行符的命令。
  3. 使用Ctrl-插入或使用上下文菜单(通常通过右键单击访问)复制选择。
  4. 使用Shift-Insert粘贴多次,以运行命令。

您不必等到每个命令完成才粘贴。粘贴的命令进入队列,然后一个接一个地执行。


0

我今天有点

从无限流之一读取并通过管道传输到 xargs

cat /dev/zero | xargs --null echo hello there

如果您需要在其中稍作休息,则可能需要执行 sh

cat /dev/zero | xargs --null sh -c "echo hello there && sleep 3"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.