我希望只有在整个shell脚本终止时才会执行陷阱。我编写了以下shell脚本。
foo()
{
echo begin foo
trap 'echo TRAP' EXIT
echo end foo
}
bar()
{
echo begin bar
echo end bar
}
foo
bar
在我拥有的AIX 5.3系统上,它在bash和ksh93中生成所需的输出。陷阱是以下示例中最后要执行的操作。
# bash foo.sh
begin foo
end foo
begin bar
end bar
TRAP
# ksh93 foo.sh
begin foo
end foo
begin bar
end bar
TRAP
但是在ksh上,当函数foo
退出时执行陷阱。
# ksh foo.sh
begin foo
end foo
TRAP
begin bar
end bar
只有在ksh中脚本终止时才能执行陷阱?
答案 0 :(得分:1)
在 ksh88 (可能是AIX系统上的 ksh )和 ksh93 之间,函数的范围已经发生了变化。引用this list of differences between the two shells:
使用 ksh-93
name()
定义的函数与 POSIX标准,而不是 ksh-88 。不允许局部变量, 而且没有单独的范围。使用function
定义的函数 名称语法,保持兼容性。这也影响功能 痕迹。