我正在同步一些目錄。我打開了一個 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
為了擴展丹尼斯的答案,您的程式碼可能如下所示:
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/