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)?
risposta
Per gli interrupt, è possibile utilizzare onintr
per specificare un gestore che rimuove i file, quindi esce.
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.
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
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
Date un'occhiata qui - potrebbe essere quello che stai cercando http://stackoverflow.com/questions/64786/error-handling-in-bash – repoman