Browse Source

backtrace working fine!

main
pvincent 2 weeks ago
parent
commit
8f98e787ed
  1. 33
      lib/backtrace.bash
  2. 18
      test2.sh

33
lib/backtrace.bash

@ -21,11 +21,13 @@ function exit {
# # remove 0 on tail list # # remove 0 on tail list
# [[ ${#stack_lines[@]} > 0 && ${stack_lines[-1]} == 0 ]] && unset stack_lines[-1] # [[ ${#stack_lines[@]} > 0 && ${stack_lines[-1]} == 0 ]] && unset stack_lines[-1]
rm $script
if [[ $error_code > 0 ]]; then if [[ $error_code > 0 ]]; then
printf "\nEXIT #${error_code} due to error at line ${stack_lines[*]} : \n-----------------------------------------\n" printf "\nEXIT #${error_code} due to error at line ${stack_lines[*]} : \n-----------------------------------------\n"
echo "FUNCNAME: ${FUNCNAME[@]}" >&2 # inner outer main
echo "BASH_SOURCE: ${BASH_SOURCE[@]}" >&2
echo "BASH_LINENO: ${BASH_LINENO[@]}" >&2
[[ -s /tmp/error ]] && echo -ne 'CAUSE:\t\t' && cat /tmp/error
echo -e "FUNCNAME:\t${FUNCNAME[@]}" >&2 # inner outer main
echo -e "BASH_SOURCE:\t${BASH_SOURCE[@]}" >&2
echo -e "BASH_LINENO:\t${BASH_LINENO[@]}" >&2
trap - ERR TERM INT EXIT trap - ERR TERM INT EXIT
builtin exit "${error_code}" builtin exit "${error_code}"
else else
@ -41,8 +43,11 @@ function raise_error {
exit $code exit $code
} }
# MAIN
_BACKTRACE=${_BACKTRACE:-false} _BACKTRACE=${_BACKTRACE:-false}
# echo "_BACKTRACE=${_BACKTRACE}" # echo "_BACKTRACE=${_BACKTRACE}"
# a bit of magic: preserve performing the original script and rather running the backtrace version
${_BACKTRACE} && return ${_BACKTRACE} && return
set -TEue set -TEue
@ -50,5 +55,23 @@ trap 'exit $?' ERR TERM INT EXIT
# echo "current: ${BASH_SOURCE[-1]}" # echo "current: ${BASH_SOURCE[-1]}"
# echo "ARGV : $@" # echo "ARGV : $@"
export _BACKTRACE=true export _BACKTRACE=true
# exec ${BASH_SOURCE[-1]} $*
eval $(<${BASH_SOURCE[-1]}) $*
source=${BASH_SOURCE[-1]}
script="${source}.backtrace"
cp $source $script
# prepend the set Strict command
sed -i '1s/.*/set -TEue/' $script
# a bit of magic: save stderr into /tmp/error while outputing stdout!
{
$script 3>&1 1>&2 2>&3 | tee /tmp/error
} 2>/dev/null >/dev/null
# SOME VARIANTS (which does not work actually)
# ----------
# exec ${BASH_SOURCE[-1]} $* 2>/tmp/error
# eval $(<${BASH_SOURCE[-1]}) $* 2>/tmp/error
# eval $(<$script) $* 2>&1 >/tmp/error
# $script $* 2>&1 >>/tmp/error
# ERROR=$($script 3>&1 1>&2 2>&3 | tee /tmp/error)

18
test2.sh

@ -0,0 +1,18 @@
#!/usr/bin/env -S -- bash
## MAIN
. "lib/backtrace.bash"
function f1 {
echo START f1
# return 4
# echo $nope
grep titi titi
grep titi titi 2>/dev/null
false
echo END F1
}
echo START test2
f1
echo END test2
Loading…
Cancel
Save