Changes:
- BASH_SOURCE index was one off.
- The first line of stacktrace was pure confusion displaying executed
script together with innermost line number (which was either 125 when
STACKTRACE or 229 when skip was called.)
- We can safely ignore innermost call, as stack trace is always produced
by stacktrace function.
- It is safer to test for array length, instead of testing FUNCNAME is
main - if main function were introduced.
- Bashishm is safe to use as this function as a whole is relying on bash.
stacktrace() {
trap - ERR
- local i=0
-
- echo "## - $0:${BASH_LINENO[0]}"
- while FUNC=${FUNCNAME[$i]}; test "$FUNC" != "main"; do
- echo "## $i ${FUNC}() called from ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
+ # i=1 - ignoring innermost frame - it is always stacktrace function
+ local i=1 n=${#BASH_LINENO[*]}
+ # n-=1 - ignoring last frame as well - it is not interesting
+ let n-=1
+
+ echo "## - $0:${BASH_LINENO[$((n-1))]}"
+ while [[ $i -lt $n ]]; do
+ echo "## $i ${FUNCNAME[$i]}() called from ${BASH_SOURCE[$((i+1))]}:${BASH_LINENO[$i]}"
i=$(( i + 1 ))
done
}