1

У меня есть скрипт, который идет как показано ниже ...

некоторые определения функций сверху, и одно из них ...

function err_out    
{

 trap 'echo "ERROR in $STEP function. EXITING!";exit 1' ERR    
 #some more messages

 exit 1
}

# Main program starts here
trap 'err_out' ERR

#do something
#call some functions
#call cleanup function
#end of script

когда в функциях происходит какая-либо ошибка, они не передаются и функция err_out не вызывается.

Я пытался #!/bin/bash -E тоже; таким образом, когда возникает ошибка, скрипт завершается, но мне нужно, чтобы ошибка была правильно передана обработчику.

1 ответ1

2

Со страницы информации bash :

Все остальные аспекты среды выполнения оболочки идентичны для функции и ее вызывающей стороны с этими исключениями: DEBUG и RETURN не наследуются, если функции не был присвоен атрибут trace с использованием встроенного declare или включена опция -o functrace с помощью встроенного set (в этом случае все функции наследуют прерывания DEBUG и RETURN ), а прерывание ERR не наследуется, если не включена опция оболочки -o errtrace .

Поэтому вам нужно set -o errtrace в верхней части скрипта, чтобы ловушка ERR распространялась в ваши функции.

Кроме того, вы должны быть осторожны с этой рекурсивной ловушкой ERR в err_out . Вы действительно хотите установить новую ловушку в обработчике ошибок или вы хотите отобразить это сообщение? Если последнее, просто echo это; trap будет вызываться только в случае ошибки в вашем обработчике ошибок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .