调用函数时陷阱未激活

Trap not activated when calling functions

我正在使用 set -e 和陷阱处理程序来生成错误消息是我的 ksh 脚本。

#!/bin/ksh
set -e

myexit()
{
    if [[  != 0 ]]; then
         echo "ERROR: Script [=10=] failed unexpectedly with signal !"    
    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
}

会发生什么?

问题:为什么调用test2时test1不会导致调用myexit returns -1?


编辑:问题不是因为函数有局部陷阱。正如所解释的 here:旧式 POSIX 函数(使用 name() 语法创建的函数)与父脚本共享陷阱。

该行为似乎是 ksh88 中信号冒泡的错误。

ksh function (not posix) trap not receiving signals -HUP, -TERM but does receive -INT

我改用 dtksh,它是我系统上的较新版本,一切正常。

这个 shebang 解决了这个问题:

 #!/usr/dt/bin/dtksh