次のスクリプトを考えてみましょう。
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年申告時に修正しかし、その項目はまだ存在します。