Bash Loop - Como parar o loop quando pressiono Control-C dentro de um comando?

Bash Loop - Como parar o loop quando pressiono Control-C dentro de um comando?

Estou sincronizando novamente alguns diretórios. Eu tenho um terminal bash aberto e estou executando algo assim:

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

Porém, se eu quiser parar tudo, pressiono Control-C. Isso interrompe o rsync, mas continua para o próximo. Neste caso eu percebo o que aconteceu e então apenas pressiono Control-C como um louco até que as coisas funcionem novamente.

Existe alguma maneira de 'consertar' isso. Eu quero que se eu tiver um loop como esse e pressionar Control-C, ele me retornará ao meu shell bash.

Responder1

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

Isso também sairá do loop se uma execução individual do rsync falhar por algum motivo.

Responder2

Para expandir a resposta de Dennis, seu código pode ser parecido com:

trap "echo Exited!; exit;" SIGINT SIGTERM

Para um exemplo prático (que envolve rsync), confirahttp://gist.github.com/279849.

Responder3

Você pode definir uma armadilha para Control-C.

trap <command> SIGINT

executará o commandquando Control-C for pressionado. Basta colocar a trapdeclaração em algum lugar do seu roteiro, no ponto em que você deseja que ela se torne eficaz.

Responder4

Quando você coloca uma sequência de comandos entre parênteses, a sequência atuará como um processo único, receberá o SIGINT e terminará quando você pressionar Ctrl- C:

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

Mas! No caso do rsynccomando, ele permite múltiplas fontes, então o código que você escreveu seria melhor escrito como:

rsync -a * example.com:somewhere/

informação relacionada