Introduzione
Uno script di shell può incorrere in problemi durante la sua esecuzione, risultando in un segnale di errore che interrompe lo script in modo imprevisto.
Gli errori si verificano a causa di una progettazione errata dello script, delle azioni dell'utente o di errori di sistema. Uno script che non riesce può lasciare file temporanei che causano problemi quando un utente riavvia lo script.
Questo tutorial ti mostrerà come usare la trap
comando per garantire che i tuoi script escano sempre in modo prevedibile.

Prerequisiti
- Accesso al terminale/riga di comando.
- Un editor di testo (Nano, Vi/Vim, ecc.).
Sintassi trappole esplosive
La sintassi per il trap
il comando è:
trap [options] "[arguments]" [signals]
Il comando ha i seguenti componenti:
- Opzioni fornire funzionalità aggiuntive al comando.
- Argomenti sono i comandi
trap
viene eseguito al rilevamento di un segnale. A meno che il comando non sia una sola parola, dovrebbe essere racchiuso tra virgolette (" "
). Se l'argomento contiene più di un comando, separali con un punto e virgola (;
). - Segnali sono notifiche asincrone inviate dal sistema, che in genere indicano un'interruzione generata dall'utente o correlata al sistema. I segnali possono essere chiamati per nome o numero.
Opzioni trappole esplosive
La trap
comando accetta le seguenti opzioni:
-p
- Visualizza i comandi del segnale.-l
- Stampa un elenco di tutti i segnali e dei loro numeri.
Di seguito è riportato l'elenco completo dei 64 segnali e dei loro numeri:
# | Segnale | # | Segnale | # | Segnale |
---|---|---|---|---|---|
1 | SIGHUP | 23 | SIGURG | 45 | SIGRTMIN+11 |
2 | SEGNO | 24 | SIGXCPU | 46 | SIGRTMIN+12 |
3 | SIGQUIT | 25 | SIGXFSZ | 47 | SIGRTMIN+13 |
4 | SIGILL | 26 | SIGVTALRM | 48 | SIGRTMIN+14 |
5 | SIGTRAP | 27 | SIGPROF | 49 | SIGRTMIN+15 |
6 | SIGABRT | 28 | SIGWINCH | 50 | SIGRTMAX-14 |
7 | SIGBUS | 29 | SIGIO | 51 | SIGRTMAX-13 |
8 | SIGFPE | 30 | SIGPWR | 52 | SIGRTMAX-12 |
9 | SIGKILL | 31 | SIGSYS | 53 | SIGRTMAX-11 |
10 | SIGUSR1 | 32 | SIGWAITING | 54 | SIGRTMAX-10 |
11 | SIGSEGV | 33 | SIGLWP | 55 | SIGRTMAX-9 |
12 | SIGUSR2 | 34 | SIGRTMIN | 56 | SIGRTMAX-8 |
13 | SIGPIPE | 35 | SIGRTMIN+1 | 57 | SIGRTMAX-7 |
14 | SIGALRM | 36 | SIGRTMIN+2 | 58 | SIGRTMAX-6 |
15 | SIGTERM | 37 | SIGRTMIN+3 | 59 | SIGRTMAX-5 |
16 | SIGSTKFLT | 38 | SIGRTMIN+4 | 60 | SIGRTMAX-4 |
17 | SIGCHLD | 39 | SIGRTMIN+5 | 61 | SIGRTMAX-3 |
18 | SIGCONT | 40 | SIGRTMIN+6 | 62 | SIGRTMAX-2 |
19 | SIGSTOP | 41 | SIGRTMIN+7 | 63 | SIGRTMAX-1 |
20 | SIGTSTP | 42 | SIGRTMIN+8 | 64 | SIGRTMAX |
21 | SIGTTIN | 43 | SIGRTMIN+9 | ||
22 | SIGTTOU | 44 | SIGRTMIN+10 |
I segnali più comunemente usati con la trap
comando sono:
SIGHUP (1)
- Riordino pulitoSIGINT (2)
- InterruzioneSIGQUIT (3)
- EsciSIGABRT (6)
- AnnullaSIGALRM (14)
- SvegliaSIGTERM (15)
- Termina
Come usare la trappola in Bash
Uno scenario tipico per l'utilizzo della trap
il comando sta rilevando il SIGINT
segnale. Questo segnale viene inviato dal sistema quando l'utente interrompe l'esecuzione dello script premendo Ctrl+C .
Il seguente script di esempio stampa la parola "Test " ogni secondo finché l'utente non lo interrompe con Ctrl+C . Lo script quindi stampa un messaggio e si chiude.
trap "echo The script is terminated; exit" SIGINT
while true
do
echo Test
sleep 1
done
Il while
il ciclo nell'esempio sopra viene eseguito all'infinito. La prima riga dello script contiene il trap
comando e le istruzioni per attendere il SIGINT
signal, quindi stampa il messaggio ed esci dallo script.

La trap
Il comando viene spesso utilizzato per ripulire i file temporanei se lo script si chiude a causa di un'interruzione. L'esempio seguente definisce la cleanup
la funzione, che stampa un messaggio, rimuove tutti i file aggiunti al $TRASH
variabile ed esce dallo script.
$TRASH=$(mktemp -t tmp.XXXXXXXXXX)
trap cleanup 1 2 3 6
cleanup()
{
echo "Removing temporary files:"
rm -rf "$TRASH"
exit
}
...
La trap
nell'esempio sopra, esegue la cleanup
funzione quando rileva uno dei quattro segnali:SIGHUP
, SIGINT
, SIGQUIT
o SIGABRT
. I segnali sono indicati dal loro numero.
Puoi anche usare trap
per garantire che l'utente non possa interrompere l'esecuzione dello script. Questa caratteristica è importante quando si eseguono comandi sensibili la cui interruzione può danneggiare permanentemente il sistema. La sintassi per disabilitare un segnale è:
trap "" [signal]
Le virgolette doppie indicano che non verrà eseguito alcun comando. Ad esempio, per intercettare il SIGINT
e SIGABRT
segnali, digitare:
trap "" SIGINT SIGABRT
[a command that must not be interrupted]
Se desideri riattivare i segnali in qualsiasi momento durante lo script, ripristina le regole utilizzando il simbolo del trattino:
trap - SIGINT SIGABRT
[a command that can be interrupted]