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

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

我正在 rsync 一些目录。我打开了一个 bash 终端并执行如下操作:

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

但是如果我想停止所有操作,我会按 Control-C。这会停止 rsync,但之后它会继续执行下一个。在这种情况下,我意识到发生了什么,然后像疯子一样按 Control-C,直到一切恢复正常。

有什么方法可以“修复”这个问题吗?我想要这样,如果我有一个这样的循环,然后按下 Control-C,它就会返回到我的 bash shell。

答案1

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

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

答案2

为了扩展 Dennis 的回答,你的代码可能看起来像这样:

trap "echo Exited!; exit;" SIGINT SIGTERM

有关工作示例(恰好涉及 rsync),请查看http://gist.github.com/279849

答案3

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

trap <command> SIGINT

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

答案4

当您将一串命令放在括号内时,该字符串将作为单个进程,并将接收 SIGINT 并在您点击Ctrl-时终止C

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

但是!在命令的情况下rsync,它允许多个源,因此您编写的代码最好写成:

rsync -a * example.com:somewhere/

相关内容