Я использую set -e и обработчик прерываний для создания сообщений об ошибках, это мои ksh-скрипты.
#!/bin/ksh
set -e
myexit()
{
if [[ $1 != 0 ]]; then
echo "ERROR: Script $0 failed unexpectedly with signal $1!"
fi
}
settrap()
{
for sig in INT TERM EXIT; do
#echo "setting trap for $sig..."
trap "code=$?;trap - INT TERM EXIT;myexit $code \"$sig\"; [[ $sig == EXIT ]] || kill -$sig $$" $sig
done
}
settrap
Теперь у меня странное поведение, которое работает для вызова функций старого стиля, но не для функций, вызывающих функции.
test1()
{
echo "test1"
eval test2
}
test2()
{
echo "test2"
return -1
}
test3()
{
settrap
echo "test1"
eval test2
}
Что будет?
- test1 выйдет, но не вызовет myexit
- test2 и test3 вызовут myexit.
Вопрос : Почему test1 не вызывает вызов myexit, когда вызов test2 возвращает -1?
Редактировать: Проблема не в том, что функции имеют локальные ловушки. Как объяснено здесь : функции POSIX старого типа (созданные с использованием синтаксиса name ()) делят ловушки с родительским скриптом.