Bash Loop - How to stop the loop when I press Control-C inside a command?
I am rsyncing a few directories. I have a bash terminal open and am executing something like this:
for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done
However if I want to stop the whole things, I press Control-C. That stops the rsync, but then it keeps going to the next one. In this case I realize what has happened and then just press Control-C like a madman until things work again.
Is there some way to 'fix' this. I want it so if I have a loop like that, and press Control-C, that it will return me to my bash shell.
for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done
This will also exit the loop if an individual rsync run fails for some reason.
To expand on Dennis' answer, your code might look like:
trap "echo Exited!; exit;" SIGINT SIGTERM
For a working example (that happens to involve rsync), check out http://gist.github.com/279849.
You can set a trap for Control-C.
trap <command> SIGINT
will execute the command
when Control-C is pressed. Just put the trap
statement somewhere in your script at a point where you want it to become effective.
- Press
Ctrl-Z
to suspend the script ; kill %%
Credits, explanations and more details in this answer.