¿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?

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ó.


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.


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).


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


POSIXme hace sonreír. :) Gran sitio de enseñanza al que también has vinculado.
Cometsong
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.