【问题标题】:How to execute trap only on the termination of the entire script in ksh on AIX 5.3?如何仅在 AIX 5.3 上的 ksh 中终止整个脚本时执行陷阱?
【发布时间】:2015-05-29 00:47:20
【问题描述】:

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

【问题讨论】:

  • 在函数外声明。
  • 为什么你需要在这么多不同的shell下运行你的脚本?如果它在 ksh93bash 中产生所需的结果,为什么不坚持使用其中一种解释器呢?
  • ksh93bashksh88 下运行脚本有点像通过以下方式运行 C 程序一个 C++ 编译器。有些事情可能会奏效,有些事情可能会失败。 ksh88ksh93 实现的核心语言大致相同,但也有区别。在此处查看列表:opensource.apple.com/source/ksh/ksh-13/ksh/src/cmd/ksh93/…

标签: shell compatibility ksh


【解决方案1】:

函数的作用域在 ksh88(您的 AIX 系统上可能是 ksh)和 ksh93 之间发生了变化。引用this list of differences between the two shells:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多