为什么 ZSH 在从陷阱调用 exit 后完成执行函数?

为什么 ZSH 在从陷阱调用 exit 后完成执行函数?

考虑以下脚本:

trap "echo TRAPPEDTERM >&2; exit" TERM

termself () {
    kill -TERM $$
    echo "Survived TERM!"
}
termself
echo "Bye."

使用 BASH 执行,只需打印TRAPPEDTERM.在 ZSH 上,该termself函数完成,打印Survived TERM!,但不返回echo "Bye." 那么为什么,以及如何在 ZSH 下获得 BASH 的行为?我目前正在使用eval $functions[termself],这不自然。

$ bash -x ./termself.sh 
+ trap 'echo TRAPPEDTERM >&2; exit' TERM
+ termself
+ kill -TERM 293517
++ echo TRAPPEDTERM
TRAPPEDTERM
++ exit

$ zsh --no-rcs -x ./termself.sh 
+./termself.sh:3> trap 'echo TRAPPEDTERM >&2; exit' TERM
+./termself.sh:9> termself
+termself:1> kill -TERM 293525
+termself:1> echo TRAPPEDTERM
TRAPPEDTERM
+termself:1> exit
+termself:2> echo 'Survived TERM!'
Survived TERM!

$ bash --version ; zsh --version
GNU bash, version 5.0.18(1)-release (x86_64-pc-linux-gnu)
zsh 5.8 (x86_64-pc-linux-gnu)

答案1

这是 zsh 中的一个错误早在2019年就已经报道过并在中引用已知错误列表(Etc/BUGS在源代码分发中)

一个相关的错误(由此zsh -c 'trap "exit 1; echo x" EXIT; f() { exit; echo f; }; f'将输出x如评论中提到的)是2021 年报告时已修复,但那个仍然存在。

相关内容