Bash Loop - 當我在指令中按 Control-C 時如何停止循環?

Bash Loop - 當我在指令中按 Control-C 時如何停止循環?

我正在同步一些目錄。我打開了一個 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/

相關內容