调用函数时陷阱未激活

时间:2018-09-11 16:08:15

标签: ksh trap

我正在使用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。

问题:当对test2的调用返回-1时,为什么test1没有导致myexit被调用?


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

1 个答案:

答案 0 :(得分:1)

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

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

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

这个shebang解决了这个问题:

 #!/usr/dt/bin/dtksh