Я собираюсь использовать ловушку для выполнения некоторого кода очистки в случае сбоя. У меня есть следующий код, но, похоже, есть некоторые синтаксические проблемы.
#!/bin/bash
set -e
function handle_error {
umount /mnt/chroot
losetup -d $LOOP_DEV1 $LOOP_DEV2
}
trap "{ echo \"$BASH_COMMAND failed with status code $?\"; handle_error; }" ERR
Видит ли кто-нибудь проблему с написанием ловушки? В случае ошибки ловушка выполняется нормально, но также выдает другое нежелательное сообщение об ошибке ниже.
/root/myscript.sh: line 60: } ERR with status code 0: command not found
##line 60 is that line of code that exited with a non zero status
Как мне написать это правильно, чтобы не было сообщения об ошибке? А что, если бы мне пришлось отправить аргументы $ LOOP_DEV1 и $ LOOP_DEV2 из основного скрипта в ловушку, а затем в функцию handle_error? Прямо сейчас они экспортируются как переменные среды в основной скрипт. Я поискал примеры ловушек, но ничего похожего не нашел.
ИЗМЕНИТЬ
Я изменил шебанг с / bin / sh на / bin / bash. Поскольку / bin / sh уже был привязан к bash, я не ожидал единорогов и не видел их.
sh
, а не сbash
, вам необходимо определить функцию сhandle_error () {
. Ключевое словоfunction
- это расширениеbash
. - person chepner   schedule 13.07.2013#!/bin/bash
в строке shbang, даже если окажется, что/bin/sh
является символической ссылкой на/bin/bash
. Таким образом, если ваш сценарий когда-либо запускается в системе, где/bin/sh
не символическая ссылка на/bin/bash
, он все равно будет работать правильно. - person Adam Rosenfield   schedule 13.07.2013bash
запущен под именем/bin/sh
, хотя, похоже, здесь это не так. - person chepner   schedule 14.07.2013