2013-03-06 1 views
5

Ho uno script che scrive su file temporanei per facilitare la sua esecuzione. Alla fine del mio script, chiamo semplicemente il numero rm filename per pulire i file temporanei che ho creato. Il problema è quando lo script termina a causa di un errore o viene interrotto. In questi casi, l'istruzione rm non viene mai raggiunta e pertanto i file non vengono mai puliti. Esiste un modo per specificare un comando da eseguire all'uscita indipendentemente dal fatto che si sia verificata o meno l'uscita?Esiste un modo per eseguire un comando all'uscita (indipendentemente da come è uscito lo script)?

+0

Date un'occhiata qui - potrebbe essere quello che stai cercando http://stackoverflow.com/questions/64786/error-handling-in-bash – repoman

risposta

0

Per gli interrupt, è possibile utilizzare onintr per specificare un gestore che rimuove i file, quindi esce.

2

Sì; si può scrivere:

trap 'rm filename' EXIT 

(. Vedi la descrizione di trap in §4.1 "Bourne Shell Builtins" of the Bash Reference Manual)

Naturalmente ci sono casi estremi in cui il comando non verrà eseguito — ad esempio, se qualcuno stacca improvvisamente la macchina, o anche solo invia SIGKILL all'istanza Bash che esegue lo script — ma questo è il più affidabile possibile.

2

Sì, è possibile utilizzare trap in questo modo:

trap "rm -f filename" EXIT 

Uno script potrebbe essere la seguente:

#/bin/bash 
trap "rm -f filename" EXIT # remove file when script exits 
touch filename    # create file 
some-invalid-command   # trigger an error 
+0

Hmmm questo non sembra funzionare per me. I file esistono ancora quando lo script termina – imnotfred

+0

Provare l'esempio che ho postato, dovrebbe funzionare bene se si dispone dell'autorizzazione per eliminare il file in questione. – Martin

0

Per interruzioni: impostare lo script a segnali trappola come SIGHUP e SIGTERM. Questo ti aiuterà con tutto tranne SIGKILL (che non può essere catturato). Google "segnale di script bash trappola"

Per uscire nonsuccessful: la struttura si codifica in modo tale che si chiama una funzione per rm nome del file (o semplicemente mettere la dichiarazione) prima di uscire lo script