2015-08-21 8 views
7

Ho uno script come segue:Come usare Ctrl + C per fermare intero script non solo attuale comando

for ((i=0; i < $srccount; i++)); do 
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\"" 
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1 
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]} 
done 

Se premo Ctrl + C in risposta al comando di lettura, l'intera lo script si interrompe, ma se si preme Ctrl + C mentre il comando rsync è in esecuzione, il comando corrente rsync si interromperà e lo script continuerà il ciclo for.

C'è un modo per dire al script se l'utente ha premuto Ctrl + C mentre rsync è in esecuzione, arrestare rsync e l'uscita dal script stesso?

+0

'opt1',' opt2', 'opt3',' srccount', 'src' e' dest'are definiti nella riga precedente dello script. –

+4

'trap" esci "INT". Vedi http://unix.stackexchange.com/a/48432/50240 – bishop

+0

@ vescovo Grazie, ha funzionato. Per favore, scrivilo come risposta, così posso accettarlo. –

risposta

7

Ctrl +C invia il segnale di interruzione, SIGINT. Dovete dire bash per uscire quando riceve questo segnale, attraverso il trap incorporato:

trap "exit" INT 
for ((i=0; i < $srccount; i++)); do 
    echo -e "\"${src[$i]}\" will be synchronized to \"${dest[$i]}\"" 
    echo -e $'Press any key to continue or Ctrl+C to exit...\n' 
    read -rs -n1 
    rsync ${opt1} ${opt2} ${opt3} ${src[$i]} ${dest[$i]} 
done 

Si può fare sostanzialmente più che esce dopo aver ricevuto un segnale. Di solito, la pulizia dei file temporanei viene eseguita nei gestori di segnale. Fare riferimento a bash documentation per ulteriori dettagli.

Problemi correlati