如何在AIX 5.3上的ksh中终止整个脚本时执行陷阱?

时间:2015-03-25 11:15:05

标签: shell compatibility ksh

我希望只有在整个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中脚本终止时才能执行陷阱?

1 个答案:

答案 0 :(得分:1)

ksh88 (可能是AIX系统上的 ksh )和 ksh93 之间,函数的范围已经发生了变化。引用this list of differences between the two shells

  

使用 ksh-93 name()定义的函数与   POSIX标准,而不是 ksh-88 。不允许局部变量,   而且没有单独的范围。使用function定义的函数   名称语法,保持兼容性。这也影响功能   痕迹。