2012-02-10 10 views
6

Ho un po 'di codice di pulizia generico che deve essere eseguito ogni volta che un certo script bash termina, indipendentemente dal fatto che sia uscito normalmente o sia stato interrotto. Ho pensato che avrei usato lo pseudosignal trap "..." EXIT per raggiungere questo obiettivo.L'acquisizione del segnale di Bash non rileva le variabili modificate dopo la dichiarazione del blocco "trap"

Oltre alla pulizia generica, c'è anche un pezzo di pulizia specifica che dovrebbe essere eseguita solo se lo script viene completato normalmente. Ho pensato che avrei potuto scatenare questo avendo blocco 'trappola' testare una variabile, in questo modo:

#!/bin/bash 
done=false; 
trap "{   
      #generic cleanup code goes here. 
      if $done 
      then 
       #cleanup to be done only on completion goes here. 
       echo Test; 
      fi 
     }" EXIT 
#main script goes here 
done=true; 

Tuttavia, questo non funziona. Eseguendo il seguente codice non verrà mai echo "Test". L'aggiunta di una chiamata exit esplicita dopo done=true; non modifica nulla. Cosa mi manca?

Cheers!

risposta

13

Il trap viene interpolato e utilizza il valore di $ fatto nel momento in cui viene definita la trap piuttosto che quando viene eseguita. È possibile utilizzare le virgolette singole attorno alla definizione trap o definire una funzione. Definizione di una funzione è probabilmente più pulito:

 
#!/bin/sh 
done=false 
cleanup() { if $done; then echo Test; fi; } 
trap cleanup EXIT 
done=true 

Questo funziona perché l'espansione delle variabili nella funzione è differito fino a quando viene chiamata la funzione, piuttosto che quando si definisce la funzione.

Problemi correlati