Как выполнить команду до выхода Bash script?

Если Bash script имеет set -e, а команда в script возвращает ошибку, как я могу выполнить некоторую очистку до выхода script?

Например:

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

Как я могу убедиться, что /tmp/foo удален, даже если одна из команд в ... do stuff ... не работает?

Ответ 1

Вот пример использования ловушки:

#!/bin/bash -e

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

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Выход:

[email protected]:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
[email protected]:~ $

Обратите внимание, что даже если строка asdffdsa не удалась, очистка все же была выполнена.

Ответ 2

Из bash manpage (относительно встроенных функций):

trap [-lp] [[arg] sigspec...]
              Команда arg должна читаться и выполняться, когда оболочка               принимает сигнал sigspec.

Итак, как указано в Anon. answer, вызовите trap в начале script, чтобы настроить обработчик, который вы желаете на ERR.

Ответ 3

Из ссылки для set:

-e

Выйдите немедленно, если простая команда (см. раздел 3.2.1 "Простые команды" ) выходит с ненулевым статусом, если только команда, которая терпит неудачу, является частью цикла while или while, частью оператора if, частью &; & или || list, или если статус возврата команды перевернут с помощью!. Ловушка в ERR, если установлена, выполняется до выхода оболочки.

(Акцент мой).

Ответ 4

здесь ссылка для вас по захвату сигналов и привязке -e. Посмотрите.

Ответ 5

sh версия 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