Как выполнить команду до выхода из Bash-скрипта? - PullRequest
109 голосов
/ 25 января 2010

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

Например:

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

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

Ответы [ 4 ]

172 голосов
/ 25 января 2010

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

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

Выход:

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

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

9 голосов
/ 25 января 2010

Из справочной страницы bash (относительно встроенных):

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

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

6 голосов
/ 25 января 2010

Из справочника для set:

-e

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

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

1 голос
/ 25 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...