2013-04-17 2 views
0

J'ai essayé d'utiliser trap pour supprimer un fichier temporaire à la fin d'un script shell Bourne, mais cela ne fonctionne pas:Supprimer les fichiers temporaires à la fin du script shell bourne

trap "trap \"rm \\\"$out\\\"\" EXIT INT TERM" 0 

C'est à l'intérieur une fonction, d'ailleurs, d'où la tentative d'un piège imbriqué.

Comment faire?

+0

double possible de [Sortie après les incendies de piège] (http: // stackoverflow .com/questions/14275224/exit-after-trap-fires) – tripleee

+0

Non, c'est autre chose. –

Répondre

2

Vous ne pouvez avoir qu'un seul piège pour chaque signal. Si différentes parties de votre script doivent effectuer différentes actions de nettoyage, vous devrez créer des listes d'actions de nettoyage. Puis définissez un seul gestionnaire d'interruptions qui effectue toutes les actions de nettoyage requises.

Voici un exemple:

set -xv 

PROG="$(basename -- "${0}")" 

# set up your trap handler 

TEMP_FILES=() 

trap_handler() { 
    for F in "${TEMP_FILES[@]}"; do 
     rm -f "${F}" 
    done 
} 

trap trap_handler 0 1 2 3 15 

something_that_uses_temp_files() { 
    mytemp="$(mktemp -t "${PROG}")" 
    TEMP_FILES+=("${mytemp}") 

    date > "${mytemp}" 

    # ... 
} 

# ... 

something_that_uses_temp_files 

# ... 

Il y a un seul gestionnaire de piège, mais vous pouvez enregistrer des actions de nettoyage partout dans le script en ajoutant au tableau TEMP_FILES. Les actions de nettoyage peuvent être enregistrées depuis les fonctions internes.


Si vous n'êtes pas en utilisant un shell avec des tableaux, l'idée de base est la même, mais les détails de mise en œuvre sera un peu différent. Par exemple, vous pouvez stocker la liste comme une variable de chaîne séparés par deux points, en utilisant le ${parameter%%word} expansions in every POSIX shell itérer à travers ses éléments dans le gestionnaire de piège:

#!/bin/sh 

set -xv 

PROG="$(basename -- "${0}")" 

# set up your trap handler 

TEMP_FILES="" 

trap_handler() { 
    while [ -n "${TEMP_FILES}" ]; do 
     CUR_FILE="${TEMP_FILES%%:*}" 
     TEMP_FILES="${TEMP_FILES#*:}" 
     if [ "${CUR_FILE}" = "${TEMP_FILES}" ]; then 
      # there were no colons -- CUR_FILE is the last file to process 
      TEMP_FILES="" 
     fi 

     if [ -n "${CUR_FILE}" ]; then 
      rm -f "${CUR_FILE}" 
     fi 
    done } 

trap trap_handler 0 1 2 3 15 

something_that_uses_temp_files() { 
    mytemp="$(mktemp -t "${PROG}")" 
    TEMP_FILES="${TEMP_FILES}:${mytemp}" 

    date > "${mytemp}" 

    # ... } 

# ... 

something_that_uses_temp_files 
something_that_uses_temp_files 

# ... 
+0

Je pense que vous parlez de bash parce que le shell Bourne n'a pas de tableaux. –

+0

L'idée de base s'applique toujours; voir la réponse mise à jour. – andrewdotn

Questions connexes