Как выполнить команду до выхода 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