I'm trying to write a "stack trace" function and BASH_LINENO doesn't
make sense sometimes and doesn't appear too accurate at others.

Here's my test script:

shopt -s extdebug
trap 'backtrace' ERR
set -E

backtrace() {

    echo "FUNCNAME: ${funcna...@]}"
    echo "BASH_SOURCE: ${bash_sour...@]}"
    echo "BASH_LINENO: ${bash_line...@]}"
    echo "BASH_ARGV: ${bash_ar...@]}"
    echo "BASH_ARGC: ${bash_ar...@]}"

    echo ${LINENO} ${FUNCNAME[0]} ${BASH_SOURCE[0]}
    echo ${BASH_LINENO[0]} ${FUNCNAME[1]} ${BASH_SOURCE[1]}
    echo ${BASH_LINENO[1]} ${FUNCNAME[2]} ${BASH_SOURCE[2]}
}

false_func() {

    echo "in false_func(), FUNCNAME: ${funcna...@]}"
    echo "in false_func(), BASH_LINENO: ${bash_line...@]}"
    echo "in false_func(), LINENO: ${LINENO}"
    false
    echo "after false"

}

false_func

The output of which is:

$ bash /tmp/bt.sh 
in false_func(), FUNCNAME: false_func main
in false_func(), BASH_LINENO: 28 0
in false_func(), LINENO: 22
FUNCNAME: backtrace false_func main
BASH_SOURCE: /tmp/bt.sh /tmp/bt.sh /tmp/bt.sh
BASH_LINENO: 18 28 0
BASH_ARGV: 
BASH_ARGC: 0 0
13 backtrace /tmp/bt.sh
18 false_func /tmp/bt.sh
28 main /tmp/bt.sh
after false

The BASH_LINENO array has 18 as it's second argument which is the line
number that false_func() is defined on, not the line number in that
function where it left that function for the next one (backtrace by way
of the ERR trap).

Thots?

b.

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to