¿Cómo ejecutar un comando antes de que salga un script Bash?

119

Si un script de Bash lo ha hecho set -ey un comando del script devuelve un error, ¿cómo puedo hacer una limpieza antes de que salga el script?

Por ejemplo:

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

¿Cómo puedo asegurarme de que /tmp/foose elimine, incluso si uno de los comandos ... do stuff ...falla?

David Wolever
fuente

Respuestas:

193

Aquí hay un ejemplo de cómo usar trampa:

#!/bin/bash -e

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

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Salida:

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

Observe que aunque la línea asdffdsa falló, la limpieza aún se ejecutó.

devguydavid
fuente
11

Desde la página de bashmanual (en relación con las incorporaciones):

trap [-lp] [[arg] sigspec ...]
El comando arg debe leerse y ejecutarse cuando el shell recibe señal (s) sigspec.

Entonces, como se indica en la respuesta de Anon. , Llame al trapprincipio del script para configurar el controlador que desea en ERR.

dmckee --- ex-gatito moderador
fuente
Ejecutar help trappara obtener ayuda sobre el integrado.
Flimm
8

De la referencia para set:

-mi

Salga inmediatamente si un comando simple (consulte la sección 3.2.1 Comandos simples) sale con un estado distinto de cero, a menos que el comando que falla sea parte de un bucle hasta o while, parte de una instrucción if, parte de && o || lista, o si el estado de retorno del comando se invierte usando!. Una trampa en ERR, si se establece, se ejecuta antes de que salga el shell.

(Énfasis mío).

Luego.
fuente
Podría valer la pena agregar "-E" cuando se usa "-e", ver vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Max Barraclough
3

shversión de la respuesta de devguydavid .

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

ref: shellscript.sh

Seguro
fuente
POSIXme hace sonreír. :) Gran sitio de enseñanza al que también has vinculado.
Cometsong