考虑以下脚本:
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 年报告时已修复,但那个仍然存在。