我正在使用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
}
会发生什么?
问题:当对test2的调用返回-1时,为什么test1没有导致myexit被调用?
编辑:问题不是因为函数具有局部陷阱。如here所述:老式POSIX函数(使用name()语法创建的那些函数)与父脚本共享陷阱。
答案 0 :(得分:1)
该行为似乎是ksh88中信号冒泡的错误。
ksh function (not posix) trap not receiving signals -HUP, -TERM but does receive -INT
我改用dtksh,它是系统上的较新版本,一切正常。
这个shebang解决了这个问题:
#!/usr/dt/bin/dtksh