#!/usr/bin/env -S -- bash # CONSTANTS TMP_ERROR=$(mktemp -t "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u)) # FUNCTIONS function on_exit { code=${1:-0} stack_lines=("${BASH_LINENO[@]}") stack_functions=("${FUNCNAME[@]}") stack_sources=("${BASH_SOURCE[@]}") tmp_error=${2:-/dev/null} echo "ERROR #${code} due to:" [[ -s $tmp_error ]] && cat $tmp_error && rm $tmp_error echo "${stack_lines[@]}" echo "${stack_functions[@]}" echo "${stack_sources[@]}" trap - ERR TERM INT EXIT builtin exit $code } # MAIN command=$1 shift args=("$@") args2=() for i in "${args[@]}"; do args2+=("${i@Q}"); done # echo "----$command ${args2[@]}------" set -TEue -o pipefail export -f on_exit # echo PROCESS START bash -c "set -TEue -o pipefail; trap 'on_exit \$? $TMP_ERROR' ERR TERM INT EXIT; source $command ${args2[*]}" 3>&1 1>&2 2>&3 | tee $TMP_ERROR # echo PROCESS END succesfully