function blabla { echo IN blabla OUT } function exit { local error_code stack_lines stack_functions stack_sources error_code=${1:-0} stack_lines=("${BASH_LINENO[@]}") stack_functions=("${FUNCNAME[@]}") stack_sources=("${BASH_SOURCE[@]}") unset stack_functions[0] unset stack_sources[0] unset stack_lines[-1] if [[ $error_code > 0 ]]; then printf "\nEXIT #${error_code} due to error at line ${stack_lines} : \n-----------------------------------------\n" [[ -s /tmp/error ]] && echo -ne 'CAUSE:\t\t' && cat /tmp/error echo -e "FUNCNAME:\t${stack_functions[@]}" >&2 # inner outer main echo -e "BASH_SOURCE:\t${stack_sources[@]}" >&2 echo -e "BASH_LINENO:\t${stack_lines[@]}" >&2 trap - ERR TERM INT EXIT builtin exit "${error_code}" else echo __REAL_SUCCESS fi } function _backtrace_perform { echo LAUNCH script... export -f exit export -f blabla set -TEue trap 'exit $?' ERR TERM INT EXIT source=${BASH_SOURCE[-1]} _BACKTRACE=true export _BACKTRACE echo call1 exec $source $* bash -c "set -TEue; trap 'exit $?' ERR TERM INT EXIT; source $source $*" 3>&1 1>&2 2>&3 | tee /tmp/error trap - ERR TERM INT EXIT builtin exit echo NOT VISIBLE } _BACKTRACE=${_BACKTRACE:-false} echo _BACKTRACE=${_BACKTRACE} ${_BACKTRACE} && return _backtrace_perform