我正在 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/