Bash循环-当我在命令中按Control-C时如何停止循环?


35

我正在同步一些目录。我有一个bash终端打开,正在执行如下操作:

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done

但是,如果要停止全部操作,请按Control-C。这样就停止了rsync,但随后继续进行下一个。在这种情况下,我意识到发生了什么,然后像疯子一样按Control-C,直到一切恢复正常。

有什么办法可以“解决”这个问题。我想要它,如果我有这样的循环,然后按Control-C,它将使我回到我的bash shell中。


6
丹尼斯的答案是正确的答案,但是如果您不这样做,则不必“像疯子一样按一下它”,只需按住它,然后让键盘重复进行操作即可:-)
凯尔·勃兰特

我一直只是按住Cntl-C,通常效果很好。
Scott Alan Miller 2010年

Answers:


33
for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done

如果单个rsync运行由于某种原因失败,这也将退出循环。


4
补充提示:如果您处于嵌套循环中,并且想要完全终止,请使用break 2(或将“ 2”替换为要终止的嵌套循环数)。
Dolan Antenucci 2013年


25

您可以为Control-C设置陷阱。

trap <command> SIGINT

将在command按下Control-C时执行。只需将trap语句放在脚本中某个希望使其生效的位置即可。


6

当您将命令字符串放在括号内时,该字符串将作为单个进程使用,并且将收到SIGINT并在您按Ctrl- 时终止C

(for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done)

但!对于该rsync命令,它允许多个源,因此您编写的代码将更好地编写为:

rsync -a * example.com:somewhere/


0

我倾向于在循环中添加另一个易于中断的命令。它需要按下两个ctrl-C。

for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; sleep 1 ; done

对于您可能想快速运行的rsync而言,它并不是一个很好的解决方案。但这对于其他循环也很有效,例如:

while true ; do ping -c 10 example.com ; sleep 1 ; done

每次循环时,此循环都会重新查找example.com的地址,如果您正在监视DNS更改,这将非常有用。

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.