Ловушка не активируется при вызове функций - PullRequest
0 голосов
/ 11 сентября 2018

Я использую 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 Ответ

0 голосов
/ 12 сентября 2018

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

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

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

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

 #!/usr/dt/bin/dtksh
...