トラップで終了を呼び出した後にZSHが関数の実行を終了するのはなぜですか?

トラップで終了を呼び出した後にZSHが関数の実行を終了するのはなぜですか?

次のスクリプトを考えてみましょう。

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年申告時に修正しかし、その項目はまだ存在します。

おすすめ記事