调用函数时陷阱未激活
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
}
会发生什么?
- test1 将退出但不会调用 myexit
- test2 和 test3 将调用 myexit。
问题:为什么调用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
我正在使用 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
}
会发生什么?
- test1 将退出但不会调用 myexit
- test2 和 test3 将调用 myexit。
问题:为什么调用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