bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Regression: EXIT traps always run in global context


From: Koichi Murase
Subject: Re: Regression: EXIT traps always run in global context
Date: Thu, 28 Nov 2024 22:32:52 +0900

2024年11月28日(木) 13:59 Ivan Shapovalov <intelfx@intelfx.name>:
> Repeat-By:
>         See the attached script.

I was testing the behavior of Bash, but it seems Bash's behavior has
never been stable and consistent. With the following test cases
#1...#8,

#1 "$bash" -ec    'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; false; }; f'
#2 "$bash" -e <<< 'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; false; }; f'
#3 "$bash" -ec    'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; kill -INT $$; }; f'
#4 "$bash" -e <<< 'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; kill -INT $$; }; f'
#5 "$bash" -ec    'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; kill -INT $$; :; }; f'
#6 "$bash" -e <<< 'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; kill -INT $$; :; }; f'
#7 "$bash" -ec    'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; trap : RETURN; kill -INT $$; }; f'
#8 "$bash" -e <<< 'trap "echo \"[\$FUNCNAME:\$f]\"" EXIT; f() { local
f=$FUNCNAME; trap : RETURN; kill -INT $$; }; f'

The results with different Bash versions are these:

$bash      #1      #2      #3      #4      #5      #6      #7      #8
bash-2.0   (empty) (empty) (empty) (empty) (empty) (empty) (empty) (empty)
bash-2.01  (empty) (empty) (empty) (empty) (empty) (empty) (empty) (empty)
bash-2.02  [:]     (empty) [:]     (empty) [:]     (empty) [:]     (empty)
bash-2.03  [:]     [:]     [:]     [:]     [:]     [:]     [:]     [:]
bash-2.04  [f:]    [f:f]   [f:f]   [f:f]   [f:f]   [f:f]   [f:]    [f:f]
bash-2.05a [f:]    [f:f]   [f:f]   [f:f]   [f:f]   [f:f]   [f:]    [f:f]
bash-2.05b [f:]    [f:f]   [f:f]   [f:f]   [f:f]   [f:f]   [f:]    [f:f]
bash-3.0   [f:]    [f:f]   [f:f]   [f:f]   [f:f]   [f:f]   [f:f]   [f:f]
bash-3.1   [f:]    [f:f]   [f:f]   [f:f]   [f:f]   [f:f]   [f:f]   [f:f]
bash-3.2   [f:]    [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-4.0   [f:]    [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-4.1   [f:]    [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-4.2   [f:]    [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-4.3   [f:f]   [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-4.4   [f:f]   [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-5.0   [f:f]   [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-5.1   [f:f]   [f:f]   (empty) [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-5.2   [f:]    [f:]    [:]     [:]     [f:f]   [f:f]   [f:f]   [f:f]
bash-dev   [f:]    [f:]    [:]     [:]     [f:f]   [f:f]   [f:f]   [f:f]

Your INNER_FAIL_EXIT corresponds to #6 and/or #8, and INNER_FAIL_2
corresponds to #2. If you only look at these cases (#2, #6, and #8),
one might think Bash's behavior was consistent until Bash 5.0 but
suddenly broken in Bash 5.1. However, the behavioral changes have also
happened in Bash 4.3, 3.2, 3.0, etc. In addition, there has never been
a version where the local variable is visible in the EXIT trap in all
cases.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]