Ловушка не активируется при вызове функций

Я использую 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()) делят ловушки с родительским скриптом.

1 ответ

Решение

Поведение, похоже, является ошибкой с пузырями сигнала в ksh88.

ловушка функции ksh (не posix) не получает сигналы -HUP, -TERM, но получает -INT

Я перешел на использование dtksh, который является более новой версией в моей системе, и все работает отлично.

Этот Шебанг решает проблему:

 #!/usr/dt/bin/dtksh
Другие вопросы по тегам