Supponiamo che tu abbia uno script di shell che esegue una sorta di codice di pulizia tramite una EXIT
trap, in questo modo:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
trap mytrap exit
echo I am at the end of the script.
Questo, come previsto, verrà stampato all'uscita It's a trap!
dello script:
$ sh myscript
I am at the end of the script.
It's a trap!
Modifichi lo script per aggiungere una funzione che genera un output che alla fine viene reindirizzato a un altro comando, come questo:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
myfunc () {
echo "I've got a bad feeling about this..."
}
trap mytrap exit
myfunc | cat > /dev/null
echo I am at the end of the script.
A causa della pipe, il codice in myfunc
viene eseguito in una subshell ... e le subshells non sembrano ereditare il trap
comportamento del genitore, il che significa che se si eseguono azioni qui che devono essere ripulite dal codice trap che ha vinto " non succede.
Quindi prova questo:
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
}
E non riesce ancora a innescarsi mytrap
quando esce la subshell. Si scopre che è necessario un esplicito exit
, come questo:
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
exit
}
Con il codice sopra, mytrap
si attiverà in modo appropriato all'uscita dalla sottoshell:
$ sh myscript
It's a trap!
I am at the end of the script.
It's a trap!
È un comportamento previsto? Sono stato sorpreso da diverse cose qui:
trap
le impostazioni non sono state ereditate dai subshells- l'uscita implicita da una subshell non sembra innescare una
EXIT
trap