Принятый ответ в основном правильный, я просто хочу уточнить.
Следующий пример хорошо работает:
#!/bin/bash
cleanup() {
rv=$?
rm -rf "$tmpdir"
exit $rv
}
tmpdir="$(mktemp)"
trap "cleanup" INT TERM EXIT
# Do things...
Но вы должны быть более осторожны, если выполняете очистку в строке, без функции. Например, это не сработает:
trap "rv=$?; rm -rf $tmpdir; exit $rv" INT TERM EXIT
Вместо этого вы должны экранировать переменные $rv
и $?
:
trap "rv=\$?; rm -rf $tmpdir; exit \$rv" INT TERM EXIT
Возможно, вы также захотите экранировать $tmpdir
, так как он будет оценен, когда будет выполнена строка прерывания и если значение tmpdir
изменится позже, что не даст ожидаемого поведения.
Редактировать: Используйте shellcheck , чтобы проверить ваши bash-скрипты и быть в курсе таких проблем.