Hello. I am writing a complex Bash script which on failure prints a stack trace. After upgrading to Bash 5.3.0 I noticed a strange change of behaviour in BASH_SOURCE which I believe is a bug.
While FUNCNAME has the correct content, BASH_SOURCE does not match it
element-by-element as intended. I see that the first element of
BASH_SOURCE, describing the outermost frame, is defined correctly while
the others, which should contain the name of the same source file, are
empty.
It is not shown here but BASH_LINE_NO is also correct.
This is my test case script, also attached.
--8<---------------cut here---------------start------------->8---
#!/usr/bin/env bash
f ()
{
echo -n 'FUNCNAME: '
for i in $(seq 0 $(( "${#FUNCNAME[@]}" - 1)) ); do
echo -n "'${FUNCNAME[$i]}' "
done
echo
echo -n 'BASH_SOURCE: '
for i in $(seq 0 $(( "${#BASH_SOURCE[@]}" - 1)) ); do
echo -n "'${BASH_SOURCE[$i]}' "
done
echo
}
g ()
{
local i="$1"
if test "$i" == 0; then
f
else
g $(( "$i" - 1 ))
fi
}
echo "BASH_VERSION: $BASH_VERSION"
g 3
--8<---------------cut here---------------end--------------->8---
The function f prints a stack trace, for simplicity starting from
the innermost frame.
The function g calls itself recursively with a decremented value
of its parameter unless the parameter is zero, in which case it
calls f.
At the top level I call g with a small nonzero parameter.
Now, with Bash 5.2.37 I see what was expected: the innermost
frame is a call to f, before that g was called a few times,
from g itself and at the beginning from the top level. The
definitions of f and g are all in the script.
--8<---------------cut here---------------start------------->8---
[luca@hennessy ~]$ ./bash-stack-trace
BASH_VERSION: 5.2.37(1)-release
FUNCNAME: 'f' 'g' 'g' 'g' 'g' 'main'
BASH_SOURCE: './bash-stack-trace' './bash-stack-trace' './bash-stack-trace'
'./bash-stack-trace' './bash-stack-trace' './bash-stack-trace'
--8<---------------cut here---------------end--------------->8---
which is expected.
But with 5.3.0 I get:
--8<---------------cut here---------------start------------->8---
[luca@hennessy ~]$ ~/usr-pEp/bin/bash ./bash-stack-trace
BASH_VERSION: 5.3.0(1)-release
FUNCNAME: 'f' 'g' 'g' 'g' 'g' 'main'
BASH_SOURCE: '' '' '' '' '' './bash-stack-trace'
--8<---------------cut here---------------end--------------->8---
Notice that FUNCNAME elements are empty, but the array size is
correct and matches BASH_SOURCE (and BASH_LINENO).
Best regards,
--
Luca Saiu https://ageinghacker.net
GNU Jitter https://www.gnu.org/software/jitter
GNU epsilon https://www.gnu.org/software/epsilon
pEp-mail-tool https://codeberg.org/pEp/pEp-mail-tool
I support everyone's freedom of mocking any opinion or belief, no
matter how deeply held, with open disrespect and the same unrelented
enthusiasm of a toddler who has just learned the word "poo".
bash-stack-trace
Description: Binary data
sender_key.asc
Description: application/pgp-keys
