Come eseguire un comando prima che uno script Bash esca?


119

Se uno script Bash ha set -ee un comando nello script restituisce un errore, come posso eseguire un po 'di pulizia prima che lo script esca?

Per esempio:

#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo

Come posso assicurarmi che /tmp/foovenga rimosso, anche se uno dei comandi in ... do stuff ...fallisce?

Risposte:


193

Ecco un esempio di utilizzo di trap:

#!/bin/bash -e

function cleanup {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Produzione:

dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $

Notare che anche se la riga asdffdsa non è riuscita, la pulizia è stata comunque eseguita.


11

Dalla bashmanpage (riguardante i builtin):

trap [-lp] [[arg] sigspec ...]
Il comando arg deve essere letto ed eseguito quando la shell riceve i segnali sigspec.

Quindi, come indicato nella risposta di Anon. , Chiama trapall'inizio dello script per impostare il gestore che desideri su ERR.


Corri help trapa vedere un po 'di aiuto sull'integrato.
Flimm

8

Dal riferimento per set:

-e

Esce immediatamente se un comando semplice (vedere la sezione 3.2.1 Comandi semplici) esce con uno stato diverso da zero, a meno che il comando che fallisce non sia parte di un ciclo until o while, parte di un'istruzione if, parte di un && o || list, o se lo stato di ritorno del comando viene invertito usando!. Un trap su ERR, se impostato, viene eseguito prima che la shell esca.

(Enfasi mia).


Potrebbe valere la pena aggiungere "-E" quando si usa "-e", vedere vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Max Barraclough

3

shversione della risposta di devguydavid .

#!/bin/sh
set -e
cleanup() {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

rif: shellscript.sh


POSIXmi fa sorridere. :) Ottimo sito di insegnamento anche a cui sei collegato.
Cometsong
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.