Ctrl-C em scripts bash

22

Como implemento ctrl+ cmanipulação nos scripts bash para que o script seja interrompido, bem como o comando atualmente em execução iniciado pelo script?

(Imagine que existe um script que executa algum comando de longa execução. O usuário pressiona ctrl+ ce interrompe o comando, mas o script prossegue.) Eu preciso que ele se comporte da maneira que eles são mortos.

Kolypto
fonte
1
Se o seu sistema operacional tiver o controle de tarefas ativado, outra opção seria interromper esse script (geralmente com crtl-z). Você pode continuar esse trabalho em segundo plano bg, matá-lo ou em primeiro plano fg. Veja a seção da página de manual do bash JOB CONTROL.
ott--

Respostas:

25

Você faz isso criando uma sub-rotina que deseja chamar quando o SIGINT é recebido e precisa executar trap 'subroutinename' INT.

Exemplo:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0
Kvisle
fonte
2
Observe que você também pode interceptar EXITnos casos em que você tem algo que deseja executar sempre que o script sair, independentemente de como ele foi interrompido. ( KILLCom exceção, é claro.)
Blrfl
Ótimo, obrigado! No entanto, quando 'sleep' é interrompido - o shell ainda pode conseguir executar o próximo comando enquanto a rotina trap está em execução: 'eco' nesse caso ... ou estou errado?
Kolypto
Isso não deveria ser possível, não. Não realiza tarefas em paralelo.
Kvisle